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