Я могу только догадываться, что вы, возможно, пренебрегаете тем, что когда код «изменяет» значение в «ячейке», вызвавшей событие CellValueChanged
, очевидно, будет «запускать» событие CellValueChanged
снова, когда его значение изменяется на есть заглавная строка!
Чтобы избежать этой циклической ссылки, просто выключите событие (перед тем, как изменить значение ячеек), измените значение ячеек… событие не сработает… затем снова включите событие «включено» после изменения значения.
Пример; Ниже проверяет, находится ли измененная ячейка в столбце 0, изменяет строку в ячейке, чтобы сделать первый символ заглавным. Код использует текстовое поле в форме, которое будет содержать текст, указывающий, когда происходит событие CellValueChanged
. Если код выполняется с закомментированным кодом после публикации, текстовое поле будет содержать две (2) записи каждый раз, когда изменяется значение ячейки в первом столбце. Без комментариев две строки кода покажет, что запись в текстовом поле будет иметь только одну (1) запись. Сэндвич строки кода, которая «изменяет» значение ячеек между строкой кода, которая выключает событие, и строкой кода, которая снова включает его. Надеюсь, что это имеет смысл.
private void dataGridView1_CellValueChanged(object sender, DataGridViewCellEventArgs e) {
if (e.RowIndex >= 0 && e.ColumnIndex >= 0) {
if (e.ColumnIndex == 0 && dataGridView1.Rows[e.RowIndex].Cells[0].Value != null) {
string currentData = dataGridView1.Rows[e.RowIndex].Cells[0].Value.ToString();
string newData = char.ToUpper(currentData[0]) + currentData.Substring(1);
//dataGridView1.CellValueChanged -= new DataGridViewCellEventHandler(dataGridView1_CellValueChanged);
dataGridView1.Rows[e.RowIndex].Cells[0].Value = newData;
//dataGridView1.CellValueChanged += new DataGridViewCellEventHandler(dataGridView1_CellValueChanged);
textBox3.Text += "CellValueChanged fired!" + Environment.NewLine;
}
}
}