Вручную запустить событие нажатия кнопки в DataGridView

У меня есть DataGridView в том числе DataGridViewButtonColumn, Пользователь должен иметь возможность использовать кнопку напрямую, поэтому я установил EditMode в EditOnEnter, Но первый щелчок не 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,

Есть идеи?

1 ответ

Решение

Я не думаю, что есть конкретное событие, доступное для обработки, когда DataGridViewButtonColumn ячейка нажата. DataGridView"s Cell_Clicked а также CellContentClicked события начинаются.

Я не смог получить задержку щелчка в DataGridView затем снова нужно нажать, чтобы запустить кнопку. Когда я нажал на DataGridView клетка кнопки, Cell_Clicked Событие было немедленно запущено. Изменение DataGridView"s 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);
  }
}
Другие вопросы по тегам