0

我有一个DataGridView包括一个DataGridViewButtonColumn。用户应该可以直接使用按钮,所以我设置EditModeEditOnEnter. 但是,第一次点击没有触发Click事件 - 似乎第一次点击选择/聚焦行/列?

所以我尝试使用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.

有任何想法吗?

4

1 回答 1

0

我认为DataGridViewButtonColumn单击单元格时没有可处理的特定事件。'DataGridView和事件Cell_ClickedCellContentClicked触发。

我无法延迟单击DataGridView一次然后必须再次单击才能触发按钮。当我单击DataGridView按钮单元格时,该Cell_Clicked事件立即被触发。更改DataGridView'EditMode没有任何区别。下面的代码简单地标识了从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);
  }
}
于 2017-01-21T21:54:48.167 回答