在datagridviewc#中根据内容为单元格分组着色

本文关键字:单元格 datagridviewc# | 更新日期: 2023-09-27 17:50:03

我正在处理一个绑定到Datatable的相当大的数据网格。我的目标是根据单元格中的数据为单元格分组上色。

我希望数据网格为包含值的所有单元格着色,然后在检测到新值时切换颜色,并在整个表中重复此操作。

下面是我在表格中使用的一个例子:

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

我不知道从哪里开始,我已经尝试过遍历行并检查值,但这最终会杀死性能和速度,并没有给我我正在寻找的结果。如有任何建议,不胜感激。

在datagridviewc#中根据内容为单元格分组着色

如果我正确理解您的情况,您可以通过处理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;
            }
        }

显然,您唯一的选择是遍历可数据行,因为您的数据库中没有此颜色标志。

我建议你在现有的数据表中添加一个新的dataccolumn,遍历它并设置它的颜色。

然后,你可以在" cellformatting "事件中给单元格上色。在这种情况下,您可以读取color列的值并使用它。

这里有一个完整而简单的细胞形成事件的例子:http://msdn.microsoft.com/en-us/library/system.windows.forms.datagridview.cellformatting.aspx