2012-09-20 6 views
8

Ich habe ein interessantes Problem. Ich versuche, eine Datentabelle als Datenquelle für eine Datagridview zu verwenden. Ich möchte einige Zellen der Tabelle färben, um verschiedene Dinge anzuzeigen, aber aus irgendeinem Grund wird die Farbe nicht angezeigt. Der folgende Code zeigt also eine ungefärbte Zelle.DataGridview Zelle Farbe kann nicht geändert werden, wenn Sie eine Datenquelle verwenden

dataGridView1.DataSource = table; 

dataGridView1.Rows[0].Cells[0].Style.BackColor = Color.Yellow; 

Ich kann nur eine Farbe erhalten nach der anfänglichen Form Last (zum Beispiel eine Zelle Farbe auf dem Ereignis OnClick Einstellung) angezeigt werden soll. Wenn ich jedoch die Zeilen und Spalten für die Ansicht wie im folgenden Code explizit erstelle, funktioniert die Farbgebung.

foreach (DataColumn col in table.Columns) 
    dataGridView1.Columns.Add(col.ColumnName, col.ColumnName); 

for (int i = 0; i < table.Rows.Count; i++) 
{ 
    var row = table.Rows[i]; 
    object[] values = new object[table.Columns.Count]; 
    for (int x = 0; x < table.Columns.Count; x++) 
     values[x] = row[x].ToString(); 

    dataGridView1.Rows.Add(values); 
} 

dataGridView1.Rows[0].Cells[0].Style.BackColor = Color.Yellow; 

Ich möchte den Code auf diese Weise nicht haben. Weiß jemand, was hier passiert, was mich daran hindert, die Zellen zu färben?

+1

Sie zeigen nicht, wo Sie versuchen, die Zellen zu färben - ich vermute, dass es innerhalb des Formularkonstruktors ist, nachdem InitializeComponent() aufgerufen wurde. Meine Antwort basiert darauf. –

Antwort

19

Wenn Sie die Zelle Farbe im Konstruktor des Formulars versuchen und stellen Sie treffen werden, bevor die Bindung der Daten abgeschlossen ist, so dass die Änderungen an den Zellen fragen Sie mich nicht halten (nicht warum, nur einer jener gotchas mit dem DataGridView

die einfachste Lösung, um diese ist es, die Farben ein wenig später zu setzen - in der Regel innerhalb eines DataBindingComplete Ereignishandler.

void dataGridView1_DataBindingComplete(object sender, DataGridViewBindingCompleteEventArgs e) 
{ 
    dataGridView1.Rows[0].Cells[0].Style.BackColor = Color.Yellow; 
} 

diese für statische Färbung der gr geeignet ist id - Wenn Sie möchten, dass sich die Farben entsprechend den Änderungen im Raster ändern, verwenden Sie das Ereignis CellFormatting, um die Zellen zu ändern.

+0

großartig! Danke! es hat mir sehr geholfen – Novikoff

+0

Siehe auch https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/cell-styles-in-the-windows-forms-datagridview-control, siehe Abschnitt ' Styles dynamisch setzen. – Wollmich

5

Dies ist etwas, das ich vor kurzem implementiert habe, weiß ich nicht, ob es helfen wird ??

private void dgvOutstandingReports_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
      { 
       int colIndex = e.ColumnIndex; 
       int rowIndex = e.RowIndex; 


       if (rowIndex >= 0 && colIndex >= 0) 
       { 
        DataGridViewRow theRow = dgvOutstandingReports.Rows[rowIndex]; 


        if (theRow.Cells[colIndex].Value.ToString() == "Daily Report") 
        { 
         theRow.DefaultCellStyle.BackColor = Color.LightYellow; 
        } 
        else if (theRow.Cells[colIndex].Value.ToString() == "Monthly Report") 
        { 
         theRow.DefaultCellStyle.BackColor = Color.LightGray; 
        } 
        else if (theRow.Cells[colIndex].Value.ToString() == "SMP Report") 
        { 
         theRow.DefaultCellStyle.BackColor = Color.Snow; 
        } 
        else if (theRow.Cells[colIndex].Value.ToString() == "Weekly Report") 
        { 
         theRow.DefaultCellStyle.BackColor = Color.Pink; 
        } 
        else if (theRow.Cells[colIndex].Value.ToString() == "Hourly Report") 
        { 
         theRow.DefaultCellStyle.BackColor = Color.LightSteelBlue; 
        } 
       } 
      } 
Verwandte Themen