2012-08-02 7 views
12

Ho un'applicazione esistente con un nuovo requisito per mostrare un'immagine in una cella DataGridView per indicare se il record ha un flag specifico associato o no (non utente modificabile, questo viene dal DB).Come disattivare l'immagine Null nella colonna dell'immagine DataGridView quando popolata da DataTable

Se c'è una bandiera, mostro l'immagine corrispondente, e se non c'è nessuna bandiera, non voglio che nulla venga mostrato nella colonna.

Le colonne DataGridView non sono state create in Designer di Visual Studio, altrimenti sarebbe facile. Potrei semplicemente impostare la proprietà NullValue sulla colonna. Invece, le colonne vengono create in fase di runtime quando tutti i dati vengono caricati in un DataTable, quindi viene creato un DataView da tale DataTable, quindi l'origine dati di DataGridView viene impostata su DataView.

Non riesco a riscriverlo completamente, altrimenti dovrei semplicemente definire le colonne in VS Designer invece di questo ridicolo modo di lasciare che le colonne vengano definite dal DataTable.

La mia domanda è quindi, come posso fare in modo che la colonna con le immagini non mostri nulla quando la tabella di dati sottostante ha un valore nullo?

Ecco alcuni pseudo C# per dimostrare cosa intendo. Ricorda, non l'ho scritto per usare due DataTable come questo; è stato così quando ho avuto la mano a me, e io non voglio fare cambiamenti drastici solo per aggiungere una nuova colonna ...

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: Ecco uno screenshot in modo da poter capire cosa intendo dalla piccola scatola con una X - questi sono tutti i null ...

DataGridView with Null Images

Inoltre, deve essere .NET 3.5, quindi se c'è una soluzione in .NET 4.0 solo, sono fuori fortuna.

risposta

25

ho capito questo ...

devono lanciare la colonna come un DataGridViewImageColumn, quindi impostare il DefaultCellStyle.NullValue per quella colonna a null. Dal mio esempio di cui sopra, lo faresti come questo ...

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

Credo che ho saltato la pistola chiedendo qui, ma spero che questo aiuta a qualcun altro qualche volta.

+0

Come posso fare lo stesso in VB.NET? = Nulla, suppongo? –

+0

Ho questa soluzione non funziona per l'ultima riga – camino

2

Per correggere l'intera griglia, è sufficiente aggiungere questo codice al costruttore di moduli. (e cambia il nome del tuo dataGrid):

 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; 
      } 
     }; 
Problemi correlati