Событие DataGridView для улова, когда значение ячейки изменилось пользователем
У меня есть приложение Winforms, написанное на С#.
В одном из моих DataGridViews я установил все столбцы, кроме одного, называемого "Ссылка" на ReadOnly = true;
Я хочу, чтобы приложение узнало, когда Пользователь изменил что-либо в столбце "Ссылка" , но все события, которые я пробовал до сих пор, намного больше, чем когда пользователь внес изменения. Например, CurrentCellChanged запускается, когда DataGridView изначально визуализируется, и каждый раз, когда пользователь просто нажимает или заносит вкладки вдоль строк и т.д.
Я заинтересован только в том, чтобы улавливать пользовательские изменения в данных в столбце "Ссылка" , который является ТОЛЬКО столбцом, где ReadOnly = false;
Какое лучшее событие для этого?
Ответы
Ответ 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
};
};
Ответ 3
DataGridView.CurrentCellDirtyStateChanged