2010-11-01 19 views
9

Mam DataGridView. I ustawić jego .DataSource rekwizyt być BindingList moich własnych obiektów: a BindingList<IChessItem>Formatowanie warunkowe DataGridView

Potem stworzył kilka kolumn dla niego ..

DataGridViewTextBoxColumn descColumn = new DataGridViewTextBoxColumn(); 
    descColumn.DataPropertyName = "Description"; 
    descColumn.HeaderText = "Description"; 
    descColumn.Width = 300; 

    DataGridViewTextBoxColumn gameIDColumn = new DataGridViewTextBoxColumn(); 
    gameIDColumn.DataPropertyName = "GameID"; 
    gameIDColumn.HeaderText = "Game ID"; 
    gameIDColumn.Width = 60; 

    dataGrid.Columns.Add(descColumn); 
    dataGrid.Columns.Add(gameIDColumn); 

Moje pytanie brzmi .. Chcę pokolorować jedną z kolumn ZIELONY na podstawie danych z innego pola mojej listy powiązań). Jak mogę to zrobić?

I naprawdę nie trzeba pokazać tego pola, po prostu chcą działać na danych zawartych w nim ..

w moim przypadku, jedną z dziedzin IChessItem pokazuje, czy rekord jest nowy, a ja chcesz pokolorować inne pola w datagridview, aby to odzwierciedlić.

Odpowiedz

21

Można użyć zdarzenia "CellFormatting" w DataGridView. DataGridViewCellFormattingEventArgs zawiera indeksy wiersza i kolumny bieżącej komórki w trakcie jej wiązania. Mam nadzieję, że mój przykład kodu ma trochę sensu wam:

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e) 
{ 
    // Compare the column to the column you want to format 
    if (this.dataGridView1.Columns[e.ColumnIndex].Name == "ColumnName") 
    { 
     //get the IChessitem you are currently binding, using the index of the current row to access the datasource 
     IChessItem item = sourceList[e.RowIndex]; 
     //check the condition 
     if (item == condition) 
     { 
      e.CellStyle.BackColor = Color.Green; 
     } 
    } 
} 
+0

interesujące. Wygląda na to, że to powinno działać, niestety, this.dataGridView1.Columns [e.CumnumnIndex] .Name zwraca "", gdy tylko się tu dostanie. Wygląda na to, że * powinno * działać. – KevinDeus

+0

okok. Mam go do pracy przy użyciu .DataPropertyName (ponieważ zostało to skonfigurowane w powyższym kodzie) i skierowanie go z powrotem do elementu datagrid (ponieważ mój sourcelist został wymazany przez ten punkt ..) IChessItem item = ((BindingList ) this.dgvAvailableMoves.DataSource) [e.RowIndex]; – KevinDeus

+2

Bardziej niezawodnym podejściem jest porównywanie bezpośrednio z kolumną, zamiast sprawdzania nazwy kolumny, tj. 'If (dataGridView.Columns [e.ColumnIndex] == dataGridViewColumnXXX) ... –

0

można wypełnić dane w swojej DataGridView przy użyciu dowolnego pętli lub źródła danych. Następnie dla każdego DataGridViewRow w DataGridView1.Rows ----

Chk wartość ref chcesz ypu, a następnie ustawić DataGridviewCell [index] .style.backColor Właściwość.

+5

Proszę nie iść w ten sposób do formatowania komórki - jeśli masz 10000 wierszy x 20 kolumn, będziesz sprawdzać 200000 komórek. Z drugiej strony, jeśli użyjesz zdarzenia CellFormatting, formatujesz tylko dla widocznych komórek (co jest szybsze). – zeroDivisible

Powiązane problemy