Подтвердить что ты не робот

Событие DataGridView для улова, когда значение ячейки изменилось пользователем

У меня есть приложение Winforms, написанное на С#.

В одном из моих DataGridViews я установил все столбцы, кроме одного, называемого "Ссылка" на ReadOnly = true;

Я хочу, чтобы приложение узнало, когда Пользователь изменил что-либо в столбце "Ссылка" , но все события, которые я пробовал до сих пор, намного больше, чем когда пользователь внес изменения. Например, CurrentCellChanged запускается, когда DataGridView изначально визуализируется, и каждый раз, когда пользователь просто нажимает или заносит вкладки вдоль строк и т.д.

Я заинтересован только в том, чтобы улавливать пользовательские изменения в данных в столбце "Ссылка" , который является ТОЛЬКО столбцом, где ReadOnly = false;

Какое лучшее событие для этого?

4b9b3361

Ответ 1

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
  }
}

Ответ 2

В моем случае событие CellValueChanged также инициировалось во время инициализации DGV, поэтому я хотел использовать CellEndEdit, как упомянул Кинг Кинг в своем ответе.

Чтобы сделать 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
          };
       };