2010-11-01 38 views
9

Tôi có một DataGridView. Tôi đặt prop .DataSource của nó là một BindingList của các đối tượng của riêng tôi: a BindingList<IChessItem>Điều kiện DataGridView Định dạng

Sau đó tôi tạo một số cột cho nó ..

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); 

Câu hỏi của tôi là .. Tôi muốn màu sắc một trong các cột GREEN dựa trên dữ liệu trong một lĩnh vực khác của BindingList của tôi). Tôi có thể làm cái này như thế nào?

Tôi không thực sự phải thể hiện lĩnh vực này, tôi chỉ muốn hành động theo các dữ liệu trong nó ..

trong trường hợp của tôi, một trong những lĩnh vực IChessItem cho thấy cho dù kỷ lục mới, và tôi muốn tô màu các trường khác trong datagridview để phản ánh điều đó.

Trả lời

21

Bạn có thể sử dụng sự kiện 'CellFormatting' của DataGridView. DataGridViewCellFormattingEventArgs chứa các chỉ mục của hàng và cột của ô hiện tại vì nó đang bị ràng buộc. Tôi hy vọng ví dụ về mã của tôi có ý nghĩa với bạn:

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

thú vị. Điều này có vẻ như nó sẽ làm việc, thật không may, this.dataGridView1.Columns [e.ColumnIndex] .Name trả về "" bất cứ khi nào nó được ở đây. Có vẻ như nó * nên * làm việc tho. – KevinDeus

+0

okok .. Tôi nhận được nó để làm việc bằng cách sử dụng .DataPropertyName (kể từ khi được thiết lập trong mã của tôi ở trên), và chỉ nó trở lại mục datagrid (như sourcelist của tôi đã bị xóa bởi điểm này ..) IChessItem item = ((BindingList ) this.dgvAvailableMoves.DataSource) [e.RowIndex]; – KevinDeus

+2

Cách tiếp cận mạnh mẽ hơn là so sánh trực tiếp với cột thay vì kiểm tra tên cột, nghĩa là 'if (dataGridView.Columns [e.ColumnIndex] == dataGridViewColumnXXX) ...' –

0

Bạn có thể điền dữ liệu vào DataGridView bằng bất kỳ vòng lặp hoặc nguồn dữ liệu nào. Sau đó, cho mỗi DataGridViewRow trong DataGridView1.Rows ----

Chk giá trị ref ypu muốn chk và sau đó đặt DataGridviewCell [index] .style.backColor property.

+5

Vui lòng không đi theo cách này để định dạng ô - nếu bạn có 10000 hàng x 20 cột, bạn sẽ kiểm tra 200000 ô. Mặt khác, nếu bạn sẽ sử dụng sự kiện CellFormatting, bạn đang làm định dạng chỉ cho các ô hiển thị (waaay nhanh hơn). – zeroDivisible

Các vấn đề liên quan