Получение значений сетки данных по индексу строк для последующего использования

#c# #datagrid

Вопрос:

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

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

Это то, чего я достиг до сих пор

 private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs x)  {  if (dataGridView1.Rows[x.RowIndex].Cells["Name"].Value != null) name = dataGridView1.Rows[x.RowIndex].Cells["Name"].Value.ToString();  else if (dataGridView1.Rows[x.RowIndex].Cells["LastName"].Value != null) last = dataGridView1.Rows[x.RowIndex].Cells["LastName"].Value.ToString();  }   private void dataGridView1_MouseDown(object sender, MouseEventArgs e)  {  if (e.Button == MouseButtons.Right)  {  if (last != null amp;amp; name != null)  {  ContextMenu cm = new ContextMenu();  this.ContextMenu = cm;  cm.MenuItems.Add(new MenuItem("amp;Do something with those values in this row", new System.EventHandler(this.do_Action_with_values)));  cm.Show(this, new Point(e.X, e.Y));  }  last = null;  name = null;  }  }  

Удаление: если (последнее != null amp;amp; имя != null)

Заставит меню работать, но значения не сохраняются, все они равны нулю.

Есть ли правильный способ сохранить в строках все значения столбцов для строки, на которую нажимается?

Комментарии:

1. Это кажется очень сложным.. Каждый раз, когда я когда-либо делал это, я просто подключал обработчик щелчков к элементу cm и запрашивал у сетки выбранные строки/ячейки в обработчике. Не могу понять, почему вы используете мышь для отображения меню и т. Д.; Вы можете просто добавить контекстное меню и установить его в сетку..

2. Я склонен согласиться с @CaiusJard. У вас есть обработчик мыши, который реагирует на щелчок правой кнопкой мыши (в любом месте приложения), и отдельный обработчик щелчка по ячейке, который задает значения. Обработчик щелчка правой кнопкой мыши также устанавливает значения в значение null. Упростите это, поместив весь код в один обработчик — Используйте щелчок мыши по ячейке, который использует DataGridViewCellMouseEventArgs, который содержит сведения как о ячейке (строка и столбец), так и о мыши (правая мышь), чтобы вы могли делать с ними все, что пожелаете. Тогда вам не нужно сохранять имя/фамилию, вы можете просто сразу прочитать ячейку и работать с ней.

3. @Крис, не могли бы вы привести мне пример? Я перепробовал все, что мог, вот что я смог придумать до сих пор

Ответ №1:

По запросу в комментариях используйте CellMouseClick событие и DataGridViewCellMouseEventArgs объедините ваши обработчики в один обработчик событий, который обладает всеми необходимыми свойствами.

Покупатель, будьте осторожны, приведенный ниже код был написан вне IDE, поэтому могут быть синтаксические/другие ошибки.

 private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)  {  if (e.Button != MouseButtons.Right) return;  int row = e.RowIndex;  string name = dataGridView1.Rows[row].Cells["Name"].Value;  string last = dataGridView1.Rows[row].Cells["LastName"].Value;  if (name == null || name.Trim().Length == 0) return;  if (last == null || last.Trim().Length == 0) return;  ContextMenu cm = new ContextMenu();  this.ContextMenu = cm;  cm.MenuItems.Add(new MenuItem("amp;Do something with those values in this row", new System.EventHandler(this.do_Action_with_values)));  cm.Show(this, new Point(e.X, e.Y));  }