Ручной огонь нажмите кнопку событие в DataGridView

I’ve got a DataGridViewincluding a 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.

Есть идеи?

1 ответ

  1. Я не думаю, что есть определенное событие, доступное для обработки, когда DataGridViewButtonColumnячейка нажата. The DataGridView‘ s Cell_Clickedand CellContentClickedevents get fired.

    Я не смог получить задержку нажатия в DataGridViewодин раз, а затем нужно нажать еще раз, чтобы запустить кнопку. Когда я нажал на ячейку DataGridViewкнопки, Cell_Clickedсобытие было немедленно запущено. Изменение DataGridView‘ s EditModeне имело значения. Код ниже просто определяет, какая ячейка была нажата в Cell_Clickedсобытии. Если ячейка clicked была столбцом button (1 или 2), то я вызываю метод createdButtonHandler, чтобы обработать, какая кнопка была нажата, и продолжить к правильному методу button. Надеюсь, это поможет.

    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);
      }
    }