根据列中的文本更改行颜色

Posted

技术标签:

【中文标题】根据列中的文本更改行颜色【英文标题】:Change row color based on text in column 【发布时间】:2017-06-15 01:19:03 【问题描述】:

我正在尝试根据其中一列中的文本更改 datagridviewer 中行的颜色。我收到错误消息:对象引用未设置为第一个 if 语句行上的对象实例。我根据数据源填写了datagridviewer,代码也在下面。

 void ChangeDataGridViewColor()
    
        foreach (DataGridViewRow Row in datagridviewTreatmentPrep.Rows)
        
            if (Row.Cells["Primary Onc"].Value.ToString() == "JMK")
            
                Row.DefaultCellStyle.BackColor = Color.Green;
            

            if (Row.Cells["Primary Onc"].Value.ToString() == "DBF")
            
                Row.DefaultCellStyle.BackColor = Color.Orange;
            

            else
            
                Row.DefaultCellStyle.BackColor = Color.White;
            
        

    

 void FillDataGridViewTreatmentPrep()
    
        string constring = "datasource = RadOncViewerDatabase.db";

        string TreatPrepQuery = "SELECT * FROM TreatmentPrep";

        SQLiteConnection connectionstring = new SQLiteConnection(constring);

        connectionstring.Open();

        DataTable dsTreatPrep = new DataTable();
        SQLiteDataAdapter adapterTreatPrep = new SQLiteDataAdapter(TreatPrepQuery, constring);
        adapterTreatPrep.Fill(dsTreatPrep);

        datagridviewTreatmentPrep.DataSource = dsTreatPrep;                     

        //datagridviewTreatmentPrep.BindingContext = new BindingContext();
        //this.datagridviewTreatmentPrep.DataSource = dsTreatPrep.Tables[0].DefaultView.ToTable(true, "Patient_Name");

    

【问题讨论】:

您确定Row.Cells["Primary Onc"].Value 不为空吗?您知道该行存在...但它的值可能不存在。 是的。列名称的值为 Primary Onc。我认为混淆可能在于我已经用数据集填充了 datagridviewer 并且我没有正确引用该列。 单步执行代码并查看dsTreatPrep 中的列名,如果没有名为Primary Onc 的列,那么这将解释您的错误。 此外,由于DataGridView 已绑定到表,因此您需要使用Row.DataBoundItem 之类的内容从数据表中获取正确的值。 可能需要在DataBindingComplete 事件中/之后调用,或者在RowPrePaint 事件中更好地调用***.com/questions/2189376/… 【参考方案1】:

使用RowPrePaint 事件,不要在可以为空的对象上使用.ToString()

private void dataGridView1_RowPrePaint(object sender, DataGridViewRowPrePaintEventArgs e)

    if (e.RowIndex < 0) return;
    var row = (sender as DataGridView).Rows[e.RowIndex];
    string value = Convert.ToString(row.Cells["Primary Onc"].Value);
    //or in VS 2015: string value = row.Cells["Primary Onc"].Value?.ToString();

    if (value == "JMK")
        row.DefaultCellStyle.BackColor = Color.Green;
    else if (value == "DBF")
        row.DefaultCellStyle.BackColor = Color.Orange;
    else
        row.DefaultCellStyle.BackColor = Color.White;

【讨论】:

谢谢!这确实有效!我不得不修改它以使用 @JohnG 建议的 foreach DataGridRowView。 @LitteringAnd 我希望您没有在 RowPrePaint 事件中使用循环,因为它会为每个显示的行调用。 我不得不这样做,因为没有它,您的代码会由于索引超出范围而引发错误。错误发生在 var row 行上。我认为这是因为 datagridview 最初是基于数据表的,没有什么可以索引的。只是猜测。 @Littering我想我忘了排除标题行。如果更新的代码不起作用,您可以在DataBindingComplete 事件中使用循环。【参考方案2】:

以下是我测试过的代码,它按预期工作。抱歉耽搁了。

foreach (DataGridViewRow Row in dataGridView1.Rows) 
  DataRowView drv = (DataRowView)Row.DataBoundItem;
  if (drv != null) 
    if (drv.Row["Primary Onc"].ToString() == "JMK") 
      Row.DefaultCellStyle.BackColor = Color.Green;
    
    else 
      if (drv.Row["Primary Onc"].ToString() == "DBF") 
        Row.DefaultCellStyle.BackColor = Color.Orange;
      
      else 
        Row.DefaultCellStyle.BackColor = Color.White;
      
    
  

希望这会有所帮助。

【讨论】:

谢谢@JohnG。你所做的对我来说很有意义,但是说“DataRowView 不包含单元格的定义。” 我更改了导致问题的行。很抱歉,我目前无法访问我的计算机。 @LitteringAnd 我能够对此进行测试,它按预期工作。【参考方案3】:

你必须使用 DataGridViewCellStyle 类 我的解决方案:

     int max = dgv.Rows.Count;
 DataGridViewCellStyle style;
            for (int i = 0; i < max; i++)

                for (int j = 2; j < dgv.Columns.Count; j++)

                    if (dgv[j, i].Value.ToString() == "")
                    
                        style = dgv[j, i].Style;
                        style.BackColor = Color.Red;
                        dgv[j, i].Style = style;
                     

【讨论】:

以上是关于根据列中的文本更改行颜色的主要内容,如果未能解决你的问题,请参考以下文章

QTableView 根据值更改行颜色

如果特定值在行内,则更改行中的背景颜色

当单元格更改文本时更改行颜色的脚本

根据其他行的索引更改行颜色

如何根据特定字段的值更改行的颜色?

如何根据值更改jquery dataTable中的行颜色