gpt4 book ai didi

c# - 如何检测单元格值更改datagridview c#

转载 作者:行者123 更新时间:2023-11-30 12:14:24 25 4
gpt4 key购买 nike

SOF 上的类似问题似乎没有明确的答案。

我有一个 DataGridView绑定(bind)到 BindingList<T>对象(这是自定义对象的列表;也继承了 INotifyPropertyChanged )。每个自定义对象都有一个唯一的计时器。当这些计时器超过某个值(例如 10 秒)时,我想将单元格的前景色更改为红色。

我正在使用 CellValueChanged事件,但这个事件似乎永远不会触发,即使我可以看到 DataGridView 上的计时器在变化.我应该寻找其他事件吗?下面是我的CellValueChanged处理程序。

private void checkTimerThreshold(object sender, DataGridViewCellEventArgs e)
{
TimeSpan ts = new TimeSpan(0,0,10);
if (e.ColumnIndex < 0 || e.RowIndex < 0)
return;
if (orderObjectMapping[dataGridView1["OrderID", e.RowIndex].Value.ToString()].getElapsedStatusTime().CompareTo(ts) > 0)
{
DataGridViewCellStyle cellStyle = new DataGridViewCellStyle();
cellStyle.ForeColor = Color.Red;
dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex].Style = cellStyle;
}
}

最佳答案

据我所知,当 DataSource 以编程方式更改时,无法使 DataGridView 引发事件 - 这是设计使然。

我能想到的满足您要求的最佳方法是在混合中引入 BindingSource - 绑定(bind)源在其 DataSource 更改时会引发事件。

类似这样的方法(您显然需要根据自己的需要对其进行微调):

bindingSource1.DataSource = tbData;
dataGridView1.DataSource = bindingSource1;
bindingSource1.ListChanged += new ListChangedEventHandler(bindingSource1_ListChanged);

public void bindingSource1_ListChanged(object sender, ListChangedEventArgs e)
{
DataGridViewCellStyle cellStyle = new DataGridViewCellStyle();
cellStyle.ForeColor = Color.Red;

dataGridView1.Rows[e.NewIndex].Cells[e.PropertyDescriptor.Name].Style = cellStyle;
}

通过直接订阅数据来实现此目的的另一种选择 - 如果它是 BindingList,它将使用自己的 ListChanged 事件传播 NotifyPropertyChanged 事件。在更 MVVM 的场景中,可能会更干净,但在 WinForms 中,BindingSource 可能是最好的。

关于c# - 如何检测单元格值更改datagridview c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9605608/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com