[英]DataGridView Event to Catch When Cell Value Has Been Changed by User
我有一个用 C# 编写的 Winforms 应用程序。
在我的一个 DataGridViews 中,除了名为“Reference”的列之外,我已将所有列设置为 ReadOnly = true;
我希望应用程序知道用户何时更改了“参考”列中的任何内容,但到目前为止我尝试过的所有事件都比用户进行更改时触发的事件多得多。 例如 CurrentCellChanged 在 DataGridView 最初呈现时触发,并且每次用户只需单击或沿行单击选项卡等。
我只对捕获用户对“参考”列中数据的更改感兴趣,该列是唯一的列,其中 ReadOnly = false;
哪个事件最适合用于此?
CellValueChanged
正是您所需要的:
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e){
if(dataGridView1.Columns[e.ColumnIndex].Name == "Reference"){
//your code goes here
}
}
我认为事件CellEndEdit
也适合您的需求:
private void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e){
if(dataGridView1.Columns[e.ColumnIndex].Name == "Reference"){
//your code goes here
}
}
在我的情况下,在 DGV 初始化时 CellValueChanged 事件也被触发,所以我想使用 CellEndEdit,正如 King King 在他的回答中提到的那样。
为了使King King的第二个答案更加防弹(请参阅JPProgrammer的评论),即仅反应,如果在单元格中输入了值,您可以执行以下操作:
private void DataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e)
{
int? rowIdx = e?.RowIndex;
int? colIdx = e?.ColumnIndex;
if (rowIdx.HasValue && colIdx.HasValue)
{
var dgv = (DataGridView)sender;
var cell = dgv?.Rows?[rowIdx.Value]?.Cells?[colIdx.Value]?.Value;
if (!string.IsNullOrEmpty(cell?.ToString()))
{
// your code goes here
};
};
}
注意使用?.
的空处理?.
和?[
运算符。 我已经写了它,以便它可以以更通用的方式使用,但是当然您可以添加对“参考”列的检查,只需将上面的内部if
语句替换为以下内容:
if (dgv.Columns[colIdx.Value].Name == "Reference")
{
if (!string.IsNullOrEmpty(cell?.ToString()))
{
// your code goes here
};
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.