2012-12-31 105 views
0

我正在使用一個相當大的DataGrid綁定到Datatable。我的目標是根據單元格中的數據對單元格組進行着色。基於Datagridview C#中的內容着色組單元格#

我想要datagrid爲包含值的所有單元格着色,然後在檢測到新值時切換顏色並在整個表格中重複此操作。

以下是對我的工作表中的一個例子:

Contract ID: 
    123456 //Top of the contract, color all cells in the contract blue 
    123456 //blue 
    123456 //blue 
    123456 //blue 
    456789 //New contract, color all these cells green 
    456789 //green 
    456789 //green 
    987654 //Another new contract color all these blue (or another color) again 
    etc... 

我已經試過類似的東西下面,但無濟於事...

for (int i = 0; i < myDataGridView.Rows.Count; i++) 
    { 
     if (i > 0) 
     { 
      if (myDataGridView.Rows[i].Cells["contract_id"].Value != myDatagridView.Rows[i-1].Cells["contract_id"].Value) 
      { 
      myDataGridView.CurrentRow.Cells["contract_id"].BackColor = Color.Blue; 
      } 
     } 
    } 

我不知道從哪裏開始,我已經嘗試循環遍歷行並檢查值,但這最終會導致性能和速度的崩潰,並且不會給我所尋找的結果。任何建議將不勝感激。

回答

1

如果我正確地理解你的處境,就可以實現你被處理DataGridView.CellValueChanged事件在找什麼。這可以防止你必須遍歷所有行。理論上,這應該在您填充DGV控件時起作用。

這是我正在談論的一個非常粗略的例子。您可能需要使用它才能使其適合您的特定情況。在我的情況下,當提交更改的值時,它會調整單元的Style.Backcolor。由於輸入數據時可能只有一行,因此我也設置了一個條件來處理這種情況。

如果這是Winforms DGV控件,則需要在代碼中使用Cell.Style.BackColor屬性,而不是Cell.BackColor屬性(Winforms DGV中不存在該屬性)。

您將不得不細化代碼以適合您的情況。 。 。

private void Form1_Load(object sender, EventArgs e) 
    { 
     // Add a handler for the cell value changed event: 
     this.myDataGridView.CellValueChanged += new DataGridViewCellEventHandler(myDataGridView_CellValueChanged); 
    } 

    void myDataGridView_CellValueChanged(object sender, DataGridViewCellEventArgs e) 
    { 
     // grab a reference to the changed cell: 
     DataGridViewCell cell = myDataGridView.Rows[e.RowIndex].Cells["contract_id"]; 

     // Guard against the case where this is the first row in the DGV table: 
     if (cell.RowIndex - 1 >= 0) 
     { 
      if (cell.Value != myDataGridView.Rows[cell.RowIndex - 1].Cells["contract_id"].Value) 
      { 
       // CHange the Style.BackColor property for the cell: 
       myDataGridView.CurrentRow.Cells["contract_id"].Style.BackColor = Color.Blue; 
      } 
     } 
0

由於數據庫中沒有此顏色標誌,因此最終您的唯一選擇是循環顯示數據錶行。

我建議你添加一個新的datacolumn到你現有的數據表中,通過它循環並設置你的顏色。

然後,您可以着色「CellFormating」事件中的單元格。在這種情況下,您可以讀取顏色列的值並使用它。

還有這裏的cellformating事件的完整而簡單的例子: http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.cellformatting.aspx

問候

+0

請記住,您可以使用DataGridViewRow.DataBoundItem屬性訪問「當前」數據行。您可以通過yourDataGridView1.Rows [e.RowIndex]獲取當前的datagridviewrow。 – Luferogo

相關問題