Отмените выбор текста в 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...
  }
}

Обратите внимание, что условия, которые я использовал выше, могут быть изменены в соответствии с вашими желаниями, это зависит от вас.

Другие вопросы по тегам