对SOF的类似问题似乎没有明确的答案。
我有DataGridView
绑定到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;
}
}
答案 0 :(得分:3)
当我的DataSource以编程方式更改时,我无法让DataGridView引发事件 - 这是设计的。
我能想到满足您要求的最佳方式是将BindingSource引入混合 - 绑定源会在其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可能是最好的。