我有一个用C#编写的Winforms应用程序。
在我的一个DataGridViews中,除了一个名为'Reference'的列之外,我已将所有列设置为ReadOnly = true;
我希望应用程序知道用户何时更改了“参考”列中的任何内容,但到目前为止我尝试过的所有事件都比用户进行更改时要多得多。例如,CurrentCellChanged在最初呈现DataGridView时触发,并且每次用户只需单击行或其他选项卡等。
我只对在“参考”列中捕获用户对数据的更改感兴趣,该列是ReadOnly = false的唯一列;
哪个是最好的事件?
答案 0 :(得分:28)
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
}
}
答案 1 :(得分:0)
在我的情况下,DGV初始化时还触发了CellValueChanged事件,所以我想使用CellEndEdit,就像King King在他的回答中提到的那样。
要使King King的第二个答案更加防弹(请参见JPProgrammer的注释),即仅当在单元格中输入值时才做出反应,您可以执行以下操作:< / p>
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
};
};
}
请注意使用?.
和?[
运算符进行空处理。我已经编写了它,以便可以更一般地使用它,但是您当然可以添加对“ Reference”列的检查,只需将下面的内部if
语句替换为以下内容即可:
if (dgv.Columns[colIdx.Value].Name == "Reference")
{
if (!string.IsNullOrEmpty(cell?.ToString()))
{
// your code goes here
};
};
答案 2 :(得分:-3)