根据列中的文本更改行颜色
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;
【讨论】:
以上是关于根据列中的文本更改行颜色的主要内容,如果未能解决你的问题,请参考以下文章