2012-08-02 11 views
12

Ich habe eine bestehende Anwendung mit einer neuen Anforderung, ein Bild in einer DataGridView-Zelle anzuzeigen, ob der Datensatz ein bestimmtes Flag zugeordnet ist oder nicht (nicht Benutzer editierbar, das kommt von der DB).Deaktivieren von Null Bild in DataGridView Bildspalte, wenn von DataTable

Wenn es ein Flag gibt, zeige ich das entsprechende Bild, und wenn es kein Flag gibt, möchte ich nichts in der Spalte angezeigt werden.

Die DataGridView-Spalten wurden nicht in Visual Studio-Designer erstellt, sonst wäre dies einfach. Ich könnte einfach die NullValue-Eigenschaft für die Spalte festlegen. Stattdessen werden die Spalten zur Laufzeit erstellt, wenn alle Daten in eine DataTable geladen werden. Anschließend wird aus dieser DataTable eine DataView erstellt, und dann wird die Datenquelle der DataGridView auf DataView gesetzt.

Ich kann das nicht komplett neu schreiben, oder ich würde nur die Spalten in VS Designer anstelle dieser lächerlichen Art und Weise der Spalten aus der DataTable definiert werden.

Meine Frage ist dann, wie kann ich es so machen, dass die Spalte mit den Bildern nichts zeigt, wenn die zugrundeliegende Datentabelle eine Null hat?

Hier ist einige Pseudo C# zu demonstrieren, was ich meine. Denken Sie daran, ich habe es nicht geschrieben, um zwei DataTables wie dieses zu verwenden; es war auf diese Weise, als ich es mir übergeben hatte, und ich will nicht drastische Veränderungen nur um eine neue Spalte hinzuzufügen ...

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: Hier ist ein Screenshot, damit Sie sehen, was ich meine durch die kleine Box mit einem X - das sind alle nulls ...

DataGridView with Null Images

auch hat es .NET 3.5, um so, wenn es in .NET 4.0 nur eine Lösung ist, ich bin aus Glück.

Antwort

25

Ich dachte this out ...

Haben die DefaultCellStyle.NullValue für diese Spalte werfen stellen Sie die Spalte als DataGridViewImageColumn, dann auf null. Von meinem obigen Beispiel würden Sie es so machen ...

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

Ich glaube, ich voreilig zu fragen hier, aber hoffen, dass dies jemand anderes irgendwann hilft.

+0

Wie kann ich das gleiche in VB.NET tun? = Nichts, nehme ich an? –

+0

Ich habe diese Lösung nicht für die letzte Zeile arbeiten – camino

2

Um das gesamte Raster zu fixieren, fügen Sie diesen Code einfach zum Formular-Konstruktor hinzu. (und ändern Sie den Namen Ihres 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; 
      } 
     }; 
Verwandte Themen