Я разрабатываю приложение для Windows, используя C #. Я использую DataGridView
для отображения данных. Я добавил столбец кнопки в этом. Я хочу знать, как я могу обработать событие нажатия на эту кнопку в DataGridView.
c#
.net
winforms
datagridview
Himadri
источник
источник
Ответы:
Вы добавили кнопку к своей
DataGridView
и хотите запускать некоторый код при нажатии.Легко peasy - просто выполните следующие действия:
Этикет:
Во-первых, вот что НЕ нужно делать:
Я бы избегал предложений, содержащихся в некоторых других ответах здесь и даже в документации MSDN, жестко закодировать индекс столбца или имя столбца, чтобы определить, была ли нажата кнопка. Событие click регистрируется для всей сетки, поэтому каким-то образом вам нужно определить, что кнопка была нажата, но вы не должны этого делать, предполагая, что ваша кнопка живет с определенным именем столбца или индексом ... есть более простой способ ...
Кроме того, будьте осторожны, какое событие вы хотите обработать. Опять же, документация и многие примеры ошибаются. Большинство примеров обрабатывают
CellClick
событие, которое сработает:... но также срабатывает при каждом щелчке по заголовку строки . Это требует добавления дополнительного кода просто для определения, если
e.RowIndex
значение меньше 0Вместо этого обработайте
CellContentClick
только то, что происходит:По какой-либо причине заголовок столбца также считается «содержимым» в ячейке, поэтому нам все еще придется проверить это ниже.
Dos:
Итак, вот что вы должны сделать:
Сначала приведите отправителя к типу,
DataGridView
чтобы раскрыть его внутренние свойства во время разработки. Вы можете изменить тип параметра, но иногда это может усложнить добавление или удаление обработчиков.Затем, чтобы увидеть, была ли нажата кнопка, просто убедитесь, что столбец, в котором происходит событие, имеет тип
DataGridViewButtonColumn
. Поскольку мы уже приводим отправителя к типуDataGridView
, мы можем получитьColumns
коллекцию и выбрать текущий столбец, используяe.ColumnIndex
. Затем проверьте, имеет ли этот объект типDataGridViewButtonColumn
.Конечно, если вам необходимо различать несколько кнопок на сетке, вы можете выбрать их на основе имени столбца или индекса, но это не должно быть вашей первой проверкой. Всегда убедитесь, что кнопка была нажата в первую очередь, а затем обрабатывать все остальное соответствующим образом. В большинстве случаев, когда у вас есть только одна кнопка на сетке, вы можете сразу перейти к гонкам.
Собираем все вместе:
C # :
VB :
Обновление 1 - пользовательское событие
Если вы хотите немного повеселиться, вы можете добавить свое собственное событие, которое будет вызываться при каждом нажатии кнопки в DataGrid. Вы не можете добавить его в саму DataGrid, не запутавшись в наследовании и т. Д., Но вы можете добавить пользовательское событие в вашу форму и запустить его при необходимости. Это немного больше кода, но положительным моментом является то, что вы выделили то, что вы хотите делать при нажатии кнопки, и как определить, была ли нажата кнопка.
Просто объявите событие, поднимите его, когда это уместно, и обработайте его. Это будет выглядеть так:
Обновление 2 - Расширенная сетка
Что было бы здорово, если бы мы работали с сеткой, которая только что сделала это для нас. Мы могли бы ответить на первый вопрос легко:
you've added a button to your DataGridView and you want to run some code when it's clicked
. Вот подход, который расширяетDataGridView
. Это может не стоить хлопот, связанных с необходимостью предоставлять пользовательский элемент управления для каждой библиотеки, но, по крайней мере, он максимально использует код, используемый для определения, была ли нажата кнопка.Просто добавьте это к вашей сборке:
Вот и все. Никогда не трогай это снова. Убедитесь, что ваш DataGrid имеет тип,
DataGridViewExt
который должен работать точно так же, как DataGridView. Кроме того, это также вызовет дополнительное событие, которое вы можете обработать следующим образом:источник
TypeOf senderGrid.Rows(e.RowIndex).Cells(e.ColumnIndex) Is DataGridViewButtonCell
public class DataGridViewExt : DataGridView { public event DataGridViewCellEventHandler CellButtonClick; public DataGridViewExt() { this.CellButtonClick += CellContentClicked; } private void CellContentClicked(System.Object sender, DataGridViewCellEventArgs e) { if (this.Columns[e.ColumnIndex].GetType() == typeof(DataGridViewButtonColumn) && e.RowIndex >= 0 ) { CellButtonClick.Invoke(this, e); } } }
Это полностью отвечено здесь для WinForms: DataGridViewButtonColumn Class
и здесь: Как: реагировать на события кнопок в элементе управления GridView
для Asp.Net в зависимости от элемента управления, который вы на самом деле используете. (Ваш вопрос говорит о DataGrid, но вы разрабатываете приложение для Windows, поэтому используемый вами элемент управления - это DataGridView ...)
источник
dataGridView1_CellClick
в этот код. Можете ли вы обновить свой ответ и дать мне некоторое описание.Вот лучший ответ:
Вы не можете реализовать событие нажатия кнопки для ячеек кнопки в DataGridViewButtonColumn. Вместо этого вы используете событие CellClicked объекта DataGridView и определяете, произошло ли событие для ячейки в вашем DataGridViewButtonColumn. Используйте свойство DataGridViewCellEventArgs.RowIndex события, чтобы узнать, какая строка была нажата.
найдено здесь: событие нажатия кнопки в datagridview
источник
Это решает мою проблему.
источник
Немного опоздал к таблице здесь, но в c # (vs2013) вам также не нужно использовать имена столбцов, на самом деле большая часть дополнительной работы, которую предлагают некоторые люди, совершенно не нужна.
Столбец фактически создается как член контейнера (форма или пользовательский контроль, в который вы поместили DataGridView). Из кода дизайнера (материал, который вы не должны редактировать, кроме случаев, когда дизайнер что-то ломает), вы увидите что-то вроде:
...
...
Таким образом, в обработчике CellContentClick помимо проверки того, что индекс строки не равен 0, нужно просто проверить, действительно ли выбранный столбец является тем, который вам нужен, сравнивая ссылки на объекты:
Обратите внимание, что прелесть этого в том, что любые изменения имени будут отслеживаться компилятором. Если вы индексируете текстовое имя, которое изменяется или неправильно пишется с заглавной буквы, вы столкнетесь с проблемами во время выполнения. Здесь вы фактически используете имя объекта, который дизайнер создает на основе предоставленного вами имени. Но любое несоответствие будет доведено до вашего сведения компилятором.
источник
Вот мой фрагмент кода для запуска события click и передачи значения в другую форму:
источник
Предположим, например,
DataGridView
что столбцы, как указано ниже, и его элементы данных связаны с типом, которыйPrimalPallet
вы можете использовать решение, приведенное ниже.Безопаснее получать доступ к столбцам напрямую, чем к использованию,
dataGridView1.Columns["MyColumnName"]
и нет необходимости анализироватьsender
их, такDataGridView
как они не нужны.источник
хорошо, я укушу
вам нужно сделать что-то вроде этого - очевидно, все это метакод.
это «подключает» метод IClicked_My_Button_method к событию Click кнопки. Теперь каждый раз, когда событие «запускается» из класса владельца, наш метод также запускается.
В IClicked_MyButton_method вы просто помещаете все, что хотите, когда вы щелкаете по нему.
Фактические детали здесь до вас, но если есть что-то еще, что вы упускаете концептуально, дайте мне знать, и я постараюсь помочь.
источник
Решение с большинством голосов неверно, так как не может работать с несколькими кнопками в одном ряду.
Лучшим решением будет следующий код:
источник
просто добавьте
ToList()
метод в конец списка, где привязка к источнику данных datagridview:источник
Вы можете попробовать это, вы не будете заботиться о порядке столбцов.
источник
Например, для события ClickCell в Windows Forms.
С уважением :)
источник
Если кто-то использует C # (или см. Примечание о VB.NET ниже) и достиг этой точки, но все еще застрял, пожалуйста, продолжайте читать.
Ответ Джошуа помог мне, но не до конца. Вы заметите, что Питер спросил «Откуда ты взял бы кнопку?», Но остался без ответа.
Единственный способ, которым он работал для меня, это сделать одно из следующего, чтобы добавить обработчик событий (после установки DataSridView моего DataGridView в мой DataTable и после добавления DataGridViewButtonColumn в DataGridView):
Либо:
или:
Затем добавьте метод-обработчик (dataGridView1_CellClick или dataGridView1_CellContentClick), показанный в различных ответах выше.
Примечание. В этом отношении VB.NET отличается от C # тем, что мы можем просто добавить предложение Handles к сигнатуре нашего метода или выполнить инструкцию AddHandler, как описано в документе Microsoft « Как: вызвать обработчик событий в Visual Basic »
источник
Вы добавите столбец кнопки, как это в вашем dataGridView
Затем вы можете добавить некоторые действия в событие клика ячейки. Я обнаружил, что это самый простой способ сделать это.
Я обнаружил, что событие Cell Click автоматически подписывается часто. Поэтому мне не нужен этот код ниже. Однако, если ваше событие клика на ячейку не подписано, добавьте эту строку кода для вашего dataGridView.
источник