2012-09-20 10 views
8

Mam interesujący problem. Próbuję użyć datatable jako źródło danych dla datagridview. Chcę pokolorować niektóre komórki tabeli, aby wskazać różne rzeczy, ale z jakiegoś powodu kolory nie będą wyświetlane. Tak więc poniższy kod pokazuje niepodbarwioną komórkę.Nie można zmienić koloru komórki datagridview podczas korzystania ze źródła danych

dataGridView1.DataSource = table; 

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

Mogę uzyskać tylko kolor, który będzie wyświetlany po początkowym załadowaniu formularza (na przykład ustawienie koloru komórki w zdarzeniu OnClick). Jeśli jednak jawnie utworzę wiersze i kolumny dla widoku, tak jak w poniższym kodzie, kolorowanie działa.

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; 

Nie chcę mieć kodu w ten sposób. Czy ktoś wie, co się tutaj dzieje, co uniemożliwia mi wybarwienie komórek?

+1

Nie pokazujesz, gdzie próbujesz pokolorować komórki - domyślam się, że znajduje się on w konstruktorze formularza po wywołaniu InitializeComponent(). Moja odpowiedź jest oparta na tym. –

Odpowiedz

19

Jeśli spróbujesz i ustawić kolor komórek wewnątrz konstruktora formularza będzie uderzanie przed powiązanie danych zostanie zakończone więc zmiany w komórkach nie sklejają się (nie pytaj mnie dlaczego, po prostu jedna z tych pułapek z DataGridView

Najprostszym fix do tego celu jest ustawione kolory trochę później - zwykle w ramach obsługi DataBindingComplete zdarzeń.

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

jest to właściwe dla statycznego barwienia gr id - jeśli chcesz zmienić kolory zgodnie ze zmianami w siatce, użyj zdarzenia CellFormatting, aby zmienić komórki.

+0

świetnie! Dziękuję Ci! bardzo mi to pomogło – Novikoff

+0

Zobacz także https://docs.microsoft.com/en-us/dotnet/framework/winforms/controls/cell-styles-in-the-windows-forms-datagridview-control, patrz sekcja ' Dynamiczne ustawianie stylów. ". – Wollmich

5

To jest coś, co zaimplementowałem niedawno, nie wiem, czy to pomoże?

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; 
        } 
       } 
      } 
Powiązane problemy