在.CommitEdit(DataGridViewDataErrorContexts.Commit)之后取消选择DataGridViewTextBoxCell中的文本

时间:2013-12-16 11:02:31

标签: c# winforms forms datagridview datagridviewtextboxcell

有时,当用户在DataGridViewTextBox中键入文本时,您希望启用或禁用控件,具体取决于键入的值。例如,在键入正确的值后启用按钮

微软在一篇关于如何创建可以禁用的DataGridViewButtonCell的文章中展示了这种方式。

这是他们的伎俩(也可以在其他解决方案中看到)

  • 确保您获得事件DataGridView.CurrentCellDirtyStateChanged
  • 收到此事件后,通过调用以下方法提交当前单元格中的更改: DataGridView.CommitEdit(DataGridViewDataErrorContexts.Commit);
  • 此提交将导致事件DataGridView.CellValueChanged
  • 确保在发生此事件时收到通知
  • 在OnCellValueChanged函数中,检查更改值的有效性并确定 是否启用或禁用相应的控件(例如按钮)。

这很好,除了CommitEdit使文本在OnCellValueChanged中被选中。因此,如果要键入64,则在键入4时会收到通知,当键入4时会收到通知。但是因为选择了6,所以不会得到64,而是将6替换为4。 不知何故,代码必须在解释值之前取消选择OnCellValueChanged中的6。

属性DataGridView.Selected不起作用,它不会取消选择文本,但会取消选择单元格。

那么:如何取消选择所选单元格中的文本?

1 个答案:

答案 0 :(得分: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...
  }
}

请注意,我上面使用的条件可以根据您的需要进行修改,这取决于您。