Отмените выбор текста в DataGridViewTextBoxCell после.CommitEdit(DataGridViewDataErrorContexts.Commit)
Иногда, когда пользователь печатает текст в DataGridViewTextBox, вы хотите включить или отключить элемент управления, в зависимости от вводимого значения. Например, включите кнопку после того, как вы ввели правильное значение
Microsoft показала путь в статье о том, как создать DataGridViewButtonCell, который можно отключить.
Это их хитрость (это можно увидеть и в других решениях)
- Убедитесь, что вы получили событие DataGridView.CurrentCellDirtyStateChanged
- После получения этого события зафиксируйте изменения в текущей ячейке, вызвав: DataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
- Эта фиксация приведет к событию DataGridView.CellValueChanged
- Убедитесь, что вы получите уведомление, когда это событие поднято
- В вашей функции OnCellValueChanged проверьте правильность измененного значения и решите, включать или отключать соответствующий элемент управления (например, кнопку).
Это прекрасно работает, за исключением того, что CommitEdit делает выбор текста в OnCellValueChanged. Поэтому, если вы хотите ввести 64, вы получите уведомление, когда вы наберете 6 и позже, когда вы введете 4. Но поскольку 6 выбрано, вы не получите 64, а 6 заменено на 4. Каким-то образом код должен отменить выбор 6 в OnCellValueChanged перед интерпретацией значения.
Свойство DataGridView.Selected не помогает, не отменяет выделение текста, но отменяет выбор ячейки.
Итак: как отменить выделение текста в выделенной ячейке?
1 ответ
Я думаю, что вам нужно что-то, что, когда пользователь вводит какой-то текст в текущую ячейку, вам нужно знать текущий текст (даже перед его фиксацией), чтобы проверить, нужно ли отключить какую-либо кнопку. Поэтому следующий подход должен работать для вас. Вам не нужно совершать какие-либо вещи, просто справиться с TextChanged
событие текущего элемента редактирования, элемент управления отображается только в EditingControlShowing
обработчик события, вот код:
//The EditingControlShowing event handler for your dataGridView1
private void dataGridView1_EditingControlShowing(object sender,
DataGridViewEditingControlShowingEventArgs e){
var control = e.Control as TextBox;
if(control != null &&
dataGridView1.CurrentCell.OwningColumn.Name == "Interested Column Name"){
control.TextChanged -= textChanged_Handler;
control.TextChanged += textChanged_Handler;
}
}
private void textChanged_Handler(object sender, EventArsg e){
var control = sender as Control;
if(control.Text == "interested value") {
//disable your button here
someButton.Enabled = false;
//do other stuff...
} else {
someButton.Enabled = true;
//do other stuff...
}
}
Обратите внимание, что условия, которые я использовал выше, могут быть изменены в соответствии с вашими желаниями, это зависит от вас.