对于使用“DataGridView”的 Windows 窗体应用程序,如何检查数据源中的值并更改单独单元格的颜色?

Posted

技术标签:

【中文标题】对于使用“DataGridView”的 Windows 窗体应用程序,如何检查数据源中的值并更改单独单元格的颜色?【英文标题】:For a Windows Forms Application using `DataGridView`, how can I check a value in my DataSource and change the color of a separate cell? 【发布时间】:2016-09-16 22:27:35 【问题描述】:

非常具体的问题,我知道。我不确定如何最好地表达这一点。目前,我的cell_formatting 方法将根据单元格的值更改单元格的颜色:

    dataGridView.CellFormatting += new System.Windows.Forms.DataGridViewCellFormattingEventHandler(this.cell_formatting);


    ....


    public void cell_formatting(object sender, System.Windows.Forms.DataGridViewCellFormattingEventArgs e)
    
        if (dataGridView.Columns[e.ColumnIndex].Name.Equals("LocCode"))
        
            if (e.Value.ToString() == "OK")
            
                e.CellStyle.BackColor = Color.Red;
            
        
    

我真正需要做的是检查与我正在更改颜色的列索引不同的列索引。有一列color 将决定LocCode 单元格将变为什么颜色。

我想有一种方法可以在 cell_formatting() 中捕获我的 dataGridView.DataSource 中的哪个项目正在被查看,但我不知道如何访问它。

【问题讨论】:

【参考方案1】:

我建议你使用 DataTable 来获取颜色值。这是一个简单的例子。

我制作了一个表格并在其中添加了 3 条记录。

在form_load中,数据加载到DataGridView,

DataTable dt;
        private void Form1_Load(object sender, EventArgs e)
        
            SqlConnection conn = new SqlConnection("Server=serverName;Database=db;Trusted_Connection=True");
            conn.Open();
            SqlCommand cmd = new SqlCommand("select * from TestTable", conn);
            dt = new DataTable();
            SqlDataAdapter adp = new SqlDataAdapter(cmd);
            adp.Fill(dt);
            dataGridView1.DataSource = dt;
        

然后,我们来了 cell_formatting 事件,

private void dataGridView1_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
        
            if (dataGridView1.Columns[e.ColumnIndex].Name.Equals("TestName")) // LocCode
            
                if (e.Value != null && e.Value.ToString() != "") // Check for extra line
                
                    string a = dt.Rows[e.RowIndex]["Color"].ToString(); //current row's Color column value.
                    e.CellStyle.BackColor = Color.FromName(a); // color as backcolor
                

            
        

输出;

希望有所帮助,

【讨论】:

【参考方案2】:

我想有一种方法可以在 cell_formatting() 中捕获我的 dataGridView.DataSource 中的哪个项目,但我不知道如何访问它。

当然有。

首先,使用DataGridViewCellFormattingEventArgs.RowIndex 属性获取正在格式化的行的索引。然后使用索引获取对应的DataRow对象,最后使用DataGridViewRow.DataBoundItem属性获取对应的数据源对象,将其转换为合适的类型:

var item = dataGridView.Rows[e.RowIndex].DataBoundItem as YourDataSourceObjectType;

【讨论】:

这似乎正是我所需要的。我会实施并通知您! 好吧,看起来不错,但我在实施时不可避免地会遇到我们的范围错误。 Snippet of code 你正在使用e.ColumnIndex,而你应该使用e.RowIndex :)

以上是关于对于使用“DataGridView”的 Windows 窗体应用程序,如何检查数据源中的值并更改单独单元格的颜色?的主要内容,如果未能解决你的问题,请参考以下文章

对于使用“DataGridView”的 Windows 窗体应用程序,如何检查数据源中的值并更改单独单元格的颜色?

C#中dataGridView的列顺序问题

关于C#中 对于datagridview 单击任意一个单元格,获取那一行数据的语句

使用互操作将 datagridview 导出到 excel

怎么在VB中添加datagridview控件

将 DataGridView 导出到文本文件,保持列对齐