在 DataGridView 中手动触发按钮单击事件

Manually fire button click event in DataGridView

我有一个 DataGridView,包括一个 DataGridViewButtonColumn。用户应该可以直接使用按钮,所以我将 EditMode 设置为 EditOnEnter。但是,第一次点击没有触发 Click 事件 - 似乎第一次点击 selects/focus row/column?

所以我尝试使用 CellClick 事件:

Private Sub dgv_CellClick(sender As Object, e As DataGridViewCellEventArgs) Handles dgv.CellClick

 Dim validClick = (e.RowIndex <> -1 And e.ColumnIndex <> -1)
 If (TypeOf dgv.Columns(e.ColumnIndex) Is DataGridViewButtonColumn And validClick) Then
     dgv.BeginEdit(True)
     CType(dgv.EditingControl, Button).PerformClick()
 End If

End Sub

但是这个解决方案也没有用。 EditingControl 总是抛出 NullReferenceException.

有什么想法吗?

我认为单击 DataGridViewButtonColumn 单元格时没有可处理的特定事件。 DataGridViewCell_ClickedCellContentClicked 事件被触发。

我无法获得单击 DataGridView 一次的延迟,然后必须再次单击才能触发按钮。当我单击 DataGridView 按钮单元格时,立即触发了 Cell_Clicked 事件。更改 DataGridViewEditMode 没有任何区别。下面的代码简单地标识了从 Cell_Clicked 事件中单击了哪个单元格。如果单击的单元格是按钮列(1 或 2),那么我将调用创建的方法 ButtonHandler 来处理按下的按钮并继续使用正确的按钮方法。希望这有帮助。

private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) {
  if (e.ColumnIndex == 1 || e.ColumnIndex == 2) {
    // one of the button columns was clicked 
    ButtonHandler(sender, e);
  }
}

private void ButtonHandler(object sender, DataGridViewCellEventArgs e) {
  if (e.ColumnIndex == 1) {
    MessageBox.Show("Column 1 button clicked at row: " + e.RowIndex + " Col: " + e.ColumnIndex + " clicked");
    // call method to handle column 1 button clicked
    // MethodToHandleCol1ButtonClicked(e.RowIndex);
  }
  else {
    MessageBox.Show("Column 2 button clicked at row: " + e.RowIndex + " Col: " + e.ColumnIndex + " clicked");
    // call method to handle column 2 button clicked
    // MethodToHandleCol2ButtonClicked(e.RowIndex);
  }
}