Ответ 1
Вы добавили кнопку в свой DataGridView
и хотите запустить код при щелчке.
Легкий peasy - просто выполните следующие действия:
Этикет:
Во-первых, вот что делать НЕ:
Я бы избегал предложений в некоторых других ответах здесь и даже предоставлял документацию в MSDN для жесткого кодирования индекса столбца или имени столбца чтобы определить, была ли нажата кнопка. Регистры событий кликов для всей сетки, поэтому почему-то вам нужно определить, что нажата кнопка, но вы не должны этого делать, предположив, что ваша кнопка живет в определенном имени столбца или индексе... там проще...
Кроме того, будьте осторожны, какое событие вы хотите обработать. Опять же, документация и многие примеры ошибочны. Большинство примеров обрабатывают событие CellClick
, которое будет срабатывать:
при нажатии любой части ячейки.
... но также будет срабатывать при каждом щелчке заголовка строки. Это требует добавления дополнительного кода просто для определения того, меньше ли значение e.RowIndex
меньше 0
Вместо этого обработайте CellContentClick
, который появляется только:
при нажатии на содержимое внутри ячейки
По какой-то причине заголовок столбца также считается "содержимым" внутри ячейки, поэтому нам все равно придется проверить это ниже.
Dos:
Итак, что вам нужно сделать:
Сначала отправьте отправителю, чтобы напечатать DataGridView
, чтобы выставить его внутренние свойства во время разработки. Вы можете изменить тип параметра, но иногда это может затруднить добавление или удаление обработчиков.
Далее, чтобы увидеть, была ли нажата кнопка, просто убедитесь, что столбец, поднимающий событие, имеет тип DataGridViewButtonColumn
. Поскольку мы уже передали отправителю тип DataGridView
, мы можем получить коллекцию Columns
и выбрать текущий столбец, используя e.ColumnIndex
. Затем проверьте, имеет ли этот объект тип DataGridViewButtonColumn
.
Конечно, если вам нужно различать несколько кнопок на сетку, вы можете выбрать их на основе имени столбца или индекса, но это не должно быть вашей первой проверкой. Всегда следите за тем, чтобы сначала была нажата кнопка, а затем обработайте все что угодно. В большинстве случаев, когда у вас есть только одна кнопка для каждой сетки, вы можете сразу перейти к гонкам.
Объединяя все это:
С#:
private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e)
{
var senderGrid = (DataGridView)sender;
if (senderGrid.Columns[e.ColumnIndex] is DataGridViewButtonColumn &&
e.RowIndex >= 0)
{
//TODO - Button Clicked - Execute Code Here
}
}
VB
Private Sub DataGridView1_CellContentClick(sender As System.Object, e As DataGridViewCellEventArgs) _
Handles DataGridView1.CellContentClick
Dim senderGrid = DirectCast(sender, DataGridView)
If TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewButtonColumn AndAlso
e.RowIndex >= 0 Then
'TODO - Button Clicked - Execute Code Here
End If
End Sub
Обновление 1 - Пользовательское событие
Если вы хотите немного повеселиться, вы можете добавить свое собственное событие, которое нужно поднимать всякий раз, когда нажимается кнопка на DataGrid. Вы не можете добавить его в сам DataGrid, не запутавшись с наследованием и т.д., Но вы можете добавить настраиваемое событие в свою форму и запустить его, когда это необходимо. Это немного больше кода, но вверху является то, что вы отделили то, что хотите сделать, когда нажимаете кнопку, чтобы определить, была ли нажата кнопка.
Просто объявите событие, поднимите его, когда это необходимо, и обработайте его. Он будет выглядеть следующим образом:
Event DataGridView1ButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs)
Private Sub DataGridView1_CellContentClick(sender As System.Object, e As DataGridViewCellEventArgs) Handles DataGridView1.CellContentClick
Dim senderGrid = DirectCast(sender, DataGridView)
If TypeOf senderGrid.Columns(e.ColumnIndex) Is DataGridViewButtonColumn AndAlso e.RowIndex >= 0 Then
RaiseEvent DataGridView1ButtonClick(senderGrid, e)
End If
End Sub
Private Sub DataGridView1_ButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs) Handles Me.DataGridView1ButtonClick
'TODO - Button Clicked - Execute Code Here
End Sub
Обновление 2 - Расширенная сетка
Было бы здорово, если бы мы работали с сеткой, которая просто сделала это для нас. Мы могли бы легко ответить на начальный вопрос: you've added a button to your DataGridView and you want to run some code when it clicked
. Здесь используется подход, расширяющий DataGridView
. Возможно, не стоит беспокоиться о необходимости доставлять пользовательский элемент управления с каждой библиотекой, но по крайней мере он максимально повторяет код, используемый для определения того, была ли нажата кнопка.
Просто добавьте это в свою сборку:
Public Class DataGridViewExt : Inherits DataGridView
Event CellButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs)
Private Sub CellContentClicked(sender As System.Object, e As DataGridViewCellEventArgs) Handles Me.CellContentClick
If TypeOf Me.Columns(e.ColumnIndex) Is DataGridViewButtonColumn AndAlso e.RowIndex >= 0 Then
RaiseEvent CellButtonClick(Me, e)
End If
End Sub
End Class
Что это. Никогда не трогайте его снова. Убедитесь, что ваш DataGrid имеет тип DataGridViewExt
, который должен работать точно так же, как и DataGridView. Кроме того, это также вызовет дополнительное событие, которое вы можете обработать следующим образом:
Private Sub DataGridView1_ButtonClick(sender As DataGridView, e As DataGridViewCellEventArgs) _
Handles DataGridView1.CellButtonClick
'TODO - Button Clicked - Execute Code Here
End Sub