【问题标题】: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 事件中更好地调用stackoverflow.com/questions/2189376/…

标签: c# datagridview


【解决方案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;
                    } 

【讨论】:

    猜你喜欢
    • 2021-11-14
    • 2016-06-02
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2018-06-19
    • 1970-01-01
    • 1970-01-01
    • 2017-03-09
    相关资源
    最近更新 更多