25

我有一个用 C# 编写的 Winforms 应用程序。

在我的一个 DataGridViews 中,我已将除名为“Reference”的列之外的所有列设置为 ReadOnly = true;

我希望应用程序知道用户何时更改了“参考”列中的任何内容,但到目前为止我尝试过的所有事件都比用户进行更改时触发的要多得多。例如 CurrentCellChanged 在 DataGridView 最初呈现时触发,并且每次用户只需单击行或沿行的选项卡等。

我只对在“参考”列中捕获用户对数据的更改感兴趣,该列是 ReadOnly = false 的唯一列;

哪个是最好的事件?

4

2 回答 2

33

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
  }
}
于 2013-10-23T09:29:27.943 回答
1

在我的情况下,CellValueChanged 事件也在 DGV 初始化时触发,所以我想使用 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
          };
       };
于 2019-09-23T12:53:15.400 回答