2012-08-02 28 views
12

Tengo una aplicación existente con un nuevo requisito para mostrar una imagen en una celda DataGridView para indicar si el registro tiene un indicador específico asociado o no (no usuario editable, esto viene de DB).Cómo deshabilitar la imagen nula en la columna de imagen DataGridView cuando se rellena desde DataTable

Si hay un indicador, muestro la imagen correspondiente, y si no hay un indicador, no deseo que se muestre nada en la columna.

Las columnas DataGridView no se crearon en el diseñador de Visual Studio, o de lo contrario esto sería fácil. Podría simplemente establecer la propiedad NullValue en la columna. En su lugar, las columnas se crean en tiempo de ejecución cuando se cargan todos los datos en una DataTable, y luego se crea un DataView a partir de esa DataTable, y luego el DataSource de DataGridView se establece en DataView.

No puedo reescribir completamente esto, o simplemente definiría las columnas en VS Designer en lugar de esta manera ridícula de simplemente dejar que las columnas se definan desde la DataTable.

Mi pregunta es, entonces, ¿cómo puedo hacer para que la columna con las imágenes no muestre nada cuando la tabla de datos subyacente tiene un valor nulo?

Aquí hay algunos pseudo C# para demostrar lo que quiero decir. Recuerde, no lo escribí para usar dos DataTables como este; que era de esa manera cuando lo tenía entregado a mí, y no quiero hacer cambios drásticos sólo para añadir una nueva columna ...

DataTable rawData = someMethodThatReturnsMyRawData(); 
DataTable data = new DataTable(); 
data.Columns.Add("Flags", typeof(Image)); 
data.Columns.Add("SomeOtherColumn"); 

foreach (DataRow rawDataRow in rawData.Rows) 
{ 
    DataRow dataRow = data.NewRow(); 
    bool hasFlagType1 = false; 
    bool hasFlagType2 = false; 

    if (rawDataRow["FlagType1ID"] != DBNull.Value) 
    { 
     hasFlagType1 = true; 
    } 

    if (rawDataRow["FlagType2ID"] != DBNull.Value) 
    { 
     hasFlagType2 = true; 
    } 

    if (hasFlagType1 && hasFlagType2) 
    { 
     dataRow[0] = Properties.Resources.BothFlagsImage; 
    } 
    else if (hasFlagType1) 
    { 
     dataRow[0] = Properties.Resources.FlagType1Image; 
    } 
    else if (hasFlagType2) 
    { 
     dataRow[0] = Properties.Resources.FlagType2Image; 
    } 
    else 
    { 
     //If neither flag set, I don't want it to show anything, 
     //but if I leave it as null, a little box with an X in it shows up 
     //I could set it to some transparent GIF here, but that seems lame 
    } 

    dataRow[1] = rawDataRow["SomeOtherColumn"]; 

    data.Rows.Add(dataRow);   
} 

DataView dv = new DataView(data, string.Empty, "SomeOtherColumn ASC", DataViewRowState.CurrentRows); 

this.emptyDataGridViewFromDesigner.DataSource = dv; 

// How can I modify the column "Flags" at this point to show nothing if the value is null? 

EDIT: Aquí hay una captura de pantalla para que pueda ver lo que quiero decir por la pequeña caja con una X - esos son todos nulos ...

DataGridView with Null Images

Además, tiene que ser .NET 3.5, así que si hay una solución en .NET 4.0 sólo, estoy fuera de suerte.

Respuesta

25

me cuenta de esto ...

tienen que desechar la columna como DataGridViewImageColumn, a continuación, establecer el DefaultCellStyle.NullValue para esa columna en nulo. Desde mi ejemplo anterior, usted lo haría así ...

((DataGridViewImageColumn)this.emptyDataGridViewFromDesigner.Columns["Flags"]).DefaultCellStyle.NullValue = null; 

supongo que salte la pistola pidiendo aquí, pero espero que esto ayude a alguien más en algún momento.

+0

¿Cómo puedo hacer lo mismo en VB.NET? = Nada, supongo? –

+0

Tengo esta solución no funciona para la última fila – camino

2

Para arreglar toda la red, simplemente agregue este código al constructor de Formularios. (y cambie el nombre de su grilla de datos):

 Load += delegate 
     { 
      // remove default [x] image for data DataGridViewImageColumn columns 
      foreach (var column in dataGridView1.Columns) 
      { 
       if (column is DataGridViewImageColumn) 
        (column as DataGridViewImageColumn).DefaultCellStyle.NullValue = null; 
      } 
     }; 
Cuestiones relacionadas