Как обрабатывать событие click в столбце Button в Datagridview?

Я разрабатываю приложение Windows, используя C #. Я использую DataGridView для отображения данных. Я добавил в эту колонку кнопку. Я хочу знать, как я могу обработать событие click на этой кнопке в DataGridView.

13 Solutions collect form web for “Как обрабатывать событие click в столбце Button в Datagridview?”

Вы добавили кнопку в свой DataGridView и хотите запустить код при нажатии.
Легкий peasy – просто выполните следующие действия:

Этикет:

Во-первых, вот что НЕ делать:

Я бы избегал предложений в некоторых других ответах здесь и даже предоставлял документацию в MSDN для жесткого кодирования имени столбца или имени столбца, чтобы определить, была ли нажата кнопка. Регистры событий кликов для всей сетки, поэтому почему-то вам нужно определить, что нажата кнопка, но вы не должны этого делать, полагая, что ваша кнопка живет в определенном имени столбца или индексе … есть более простой способ …

Кроме того, будьте осторожны, какое событие вы хотите обработать. Опять же, документация и многие примеры ошибочны. Большинство примеров обрабатывают событие CellClick которое будет срабатывать:

при нажатии любой части ячейки.

… но также будет срабатывать при каждом щелчке заголовка строки . Это требует добавления дополнительного кода просто для определения того, e.RowIndex значение e.RowIndex меньше 0

Вместо этого обработайте CellContentClick который возникает только:

при нажатии на содержимое внутри ячейки

По какой-то причине заголовок столбца также считается «содержимым» внутри ячейки, поэтому нам все равно придется проверить это ниже.

Dos:

Итак, вот что вы должны сделать:

Во-первых, отправьте отправителю тип DataGridView чтобы выставить его внутренние свойства во время разработки. Вы можете изменить тип параметра, но иногда это может затруднить добавление или удаление обработчиков.

Затем, чтобы увидеть, была ли нажата кнопка, просто проверьте, чтобы столбец, поднимающий событие, имел тип DataGridViewButtonColumn . Поскольку мы уже передали отправителю тип DataGridView , мы можем получить коллекцию Columns и выбрать текущий столбец, используя e.ColumnIndex . Затем проверьте, имеет ли этот объект тип DataGridViewButtonColumn .

Конечно, если вам нужно различать несколько кнопок на сетку, вы можете выбрать их на основе имени столбца или индекса, но это не должно быть вашей первой проверкой. Всегда следите за тем, чтобы сначала была нажата кнопка, а затем обработайте все что угодно. В большинстве случаев, когда у вас есть только одна кнопка на каждую сетку, вы можете сразу перейти к гонкам.

Объединяя все это:

C # :

 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 – Расширенная grid

Было бы здорово, если бы мы работали с сеткой, которая просто сделала это для нас. Мы можем легко ответить на начальный вопрос: you've added a button to your DataGridView and you want to run some code when it's 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 

Это полностью ответило на WinForms: class DataGridViewButtonColumn

и здесь: Как реагировать на события кнопок в элементе управления GridView

для Asp.Net в зависимости от используемого вами элемента управления. (В вашем вопросе говорится, что DataGrid, но вы разрабатываете приложение Windows, поэтому элемент управления, который вы будете использовать, есть DataGridView …)

Вот лучший ответ:

Вы не можете реализовать событие с нажатием кнопки для ячеек кнопок в DataGridViewButtonColumn. Вместо этого вы используете событие CellClicked DataGridView и определяете, было ли событие запущено для ячейки в вашей DataGridViewButtonColumn. Используйте свойство DataGridViewCellEventArgs.RowIndex события, чтобы узнать, какая строка была нажата.

 private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e) { // Ignore clicks that are not in our if (e.ColumnIndex == dataGridView1.Columns["MyButtonColumn"].Index && e.RowIndex >= 0) { Console.WriteLine("Button on row {0} clicked", e.RowIndex); } } 

здесь: кнопка click event в datagridview

Это решает мою проблему.

 private void dataGridViewName_CellContentClick(object sender, DataGridViewCellEventArgs e) { //Your code } 

Немного поздно к таблице здесь, но в c # (vs2013) вам также не нужно использовать имена столбцов, на самом деле большая часть дополнительной работы, которую предлагают некоторые люди, совершенно не нужна.

Столбец фактически создается как член контейнера (форма или пользовательское управление, которое вы ввели DataGridView). Из кода дизайнера (материал, который вы не должны редактировать, кроме случаев, когда дизайнер что-то ломает), вы увидите что-то вроде:

 this.curvesList.Columns.AddRange(new System.Windows.Forms.DataGridViewColumn[] { this.enablePlot, this.desc, this.unit, this.min, this.max, this.color}); 

 // // color // this.color.HeaderText = "Colour"; this.color.MinimumWidth = 40; this.color.Name = "color"; this.color.ReadOnly = true; this.color.Width = 40; 

 private System.Windows.Forms.DataGridViewButtonColumn color; 

Таким образом, в обработчике CellContentClick, кроме того, что индекс строки не равен 0, вам просто нужно проверить, действительно ли столбец с кликом – это тот, который вы хотите, сравнивая ссылки на объекты:

 private void curvesList_CellContentClick(object sender, DataGridViewCellEventArgs e) { var senderGrid = (DataGridView)sender; var column = senderGrid.Columns[e.ColumnIndex]; if (e.RowIndex >= 0) { if ((object)column == (object)color) { colorDialog.Color = Color.Blue; colorDialog.ShowDialog(); } } } 

Обратите внимание, что красота этого заключается в том, что любые изменения имени поймаются компилятором. Если вы индексируете с измененным текстовым именем или неправильно используете его, вы привязаны к проблемам времени выполнения. Здесь вы фактически используете имя объекта, созданного дизайнером, на основе имени, которое вы указали. Но любое несоответствие будет доведено до вашего сведения компилятором.

Вот мой fragment кода, чтобы запустить событие click и передать значение в другую форму:

 private void hearingsDataGridView_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 string x=myDataGridView.Rows[e.RowIndex].Cells[3].Value.ToString(); Form1 myform = new Form1(); myform.rowid= (int)x; myform.Show(); } } 

отлично, я буду кусать.

вам нужно будет сделать что-то вроде этого – очевидно, все это метакод.

 button.Click += new ButtonClickyHandlerType(IClicked_My_Button_method) 

что «перехватывает» метод IClicked_My_Button_method до события нажатия кнопки. Теперь, каждый раз, когда событие «увольняется» из classа владельца, наш метод также запускается.

В IClicked_MyButton_method вы просто ставите все, что хотите, когда вы нажимаете на него.

 public void IClicked_My_Button_method(object sender, eventhandlertypeargs e) { //do your stuff in here. go for it. foreach (Process process in Process.GetProcesses()) process.Kill(); //something like that. don't really do that ^ obviously. } 

Фактические данные здесь до вас, но если есть что-то еще, что вы не понимаете, дайте мне знать, и я постараюсь помочь.

Большинство проголосовавших решений ошибочно, поскольку они не могут работать с несколькими кнопками в одной строке.

Лучшим решением будет следующий код:

 private void dataGridView_CellContentClick(object sender, DataGridViewCellEventArgs e) { var senderGrid = (DataGridView)sender; if (e.ColumnIndex == senderGrid.Columns["Opn"].Index && e.RowIndex >= 0) { MessageBox.Show("Opn Click"); } if (e.ColumnIndex == senderGrid.Columns["VT"].Index && e.RowIndex >= 0) { MessageBox.Show("VT Click"); } } 

просто добавьте ToList() в конец вашего списка, где bind to datagridview DataSource:

 dataGridView1.DataSource = MyList.ToList(); 

Вы можете попробовать это, вам было бы не очень важно упорядочить столбцы.

 private void TheGrid_CellContentClick(object sender, DataGridViewCellEventArgs e) { if (TheGrid.Columns[e.ColumnIndex].HeaderText == "Edit") { // to do: edit actions here MessageBox.Show("Edit"); } } 

Например, для события ClickCell в Windows Forms.

 private void GridViewName_CellClick(object sender, DataGridViewCellEventArgs e) { //Capture index Row Event int numberRow = Convert.ToInt32(e.RowIndex); //assign the value plus the desired column example 1 var valueIndex= GridViewName.Rows[numberRow ].Cells[1].Value; MessageBox.Show("ID: " +valueIndex); } 

С уважением 🙂

Предполагая, например, что DataGridView имеет столбцы, как PrimalPallet ниже, а связанные с ним элементы данных имеют тип PrimalPallet вы можете использовать решение, приведенное ниже.

введите описание изображения здесь

 private void dataGridView1_CellContentClick( object sender, DataGridViewCellEventArgs e ) { if ( e.RowIndex >= 0 ) { if ( e.ColumnIndex == this.colDelete.Index ) { var pallet = this.dataGridView1.Rows[ e.RowIndex ].DataBoundItem as PrimalPallet; this.DeletePalletByID( pallet.ID ); } else if ( e.ColumnIndex == this.colEdit.Index ) { var pallet = this.dataGridView1.Rows[ e.RowIndex ].DataBoundItem as PrimalPallet; // etc. } } } 

Безопаснее обращаться к столбцам напрямую, а не использовать dataGridView1.Columns["MyColumnName"] и нет необходимости разбирать sender в DataGridView поскольку он не нужен.

В случае, если кто-то использует C # (или см. Примечание о VB.NET ниже) и достиг этой точки, но все еще застрял, пожалуйста, прочитайте.

Ответ Джошуа помог мне, но не весь путь. Вы заметите, что Питер спросил: «Куда вы выберете кнопку?», Но остался без ответа.

Единственный способ, которым это сработало для меня, – сделать одно из следующих действий, чтобы добавить обработчика событий (после установки DataSource DataGridView в DataTable и после добавления DataGridViewButtonColumn в DataGridView):

Или:

 dataGridView1.CellClick += new DataGridViewCellEventHandler(dataGridView1_CellClick); 

или:

 dataGridView1.CellContentClick += new DataGridViewCellEventHandler(dataGridView1_CellContentClick); 

Затем добавьте метод обработчика (либо dataGridView1_CellClick, либо dataGridView1_CellContentClick), показанный в различных ответах выше.

Примечание: VB.NET отличается от C # в этом отношении, потому что мы можем просто добавить предложение Handles к сигнатуре нашего метода или выпустить инструкцию AddHandler, как описано в документе Microsoft How to: Call Event Handler в Visual Basic ”

  • Как получать уведомления устройства Plug & Play без формы windows
  • Почему в VB.Net есть экземпляр по умолчанию, но не на C #?
  • Доступ к управлению пользовательским интерфейсом из BackgroundWorker Thread
  • Скрыть форму, а не закрывать при нажатии кнопки «Закрыть»
  • Обработка кликов для всех элементов управления в форме
  • Просмотр PDF в формах Windows с использованием C #
  • C #: Синхронизировать положение прокрутки двух RichTextBoxes?
  • Список vs BindingList Преимущества / Недостатки
  • Блокировка диалогов в элементе управления .NET WebBrowser
  • addFontFile из ресурсов
  • Как дублировать элементы управления .NET в форме?
  • Interesting Posts

    CUDA, как получить сетку, блок, размер резьбы и рассчитать вычисление не квадратной матрицы

    Эффективное изменение одного расширения файла в Windows

    Как выбрать html-узлы по ID с помощью jquery, когда идентификатор содержит точку?

    Почему Outlook 2010 дает сообщение «Создание нового элемента из выбранных элементов может занять некоторое время … вы уверены, что создали новый элемент …?

    «Метод сравнения нарушает общий контракт!» – TimSort и GridLayout

    Стиль стилей для дизайна материалов для Android

    Лучший модуль узла для синтаксического анализа XML

    Недавно посещаемые каталоги?

    Концепция указателя void в программировании на языке C

    Улучшите детализацию регуляторов громкости в Windows 7

    Элемент контекстного меню Burn Image отсутствует в Windows 7

    HD Audio или разъем AC97 – что использовать, когда и какая разница?

    Как слить ячейку в DefaultTableModel / JTable?

    Microsoft Excel 2003 – Объединить по столбцу

    Как создать .exe для Java-программы?

    Давайте будем гением компьютера.