Щелкните правой кнопкой мыши, чтобы выбрать строку в Datagridview и показать меню для ее удаления
У меня есть несколько столбцов в моем DataGridView, и есть данные в моих строках. Я видел несколько решений, но я не могу их совместить!
просто способ щелкнуть правой кнопкой мыши по строке, он выберет всю строку и покажет меню с возможностью удалить строку, и когда выбран параметр, он удалит строку.
Я сделал несколько попыток, но никто не работает, и это выглядит грязно. Что же мне делать?
10 ответов:
Я, наконец, решил он:
в Visual Studio создайте ContextMenuStrip с элементом под названием "DeleteRow"
затем в ссылке DataGridView ContextMenuStrip
использование кода ниже помогло мне получить его работу.
this.MyDataGridView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MyDataGridView_MouseDown); this.DeleteRow.Click += new System.EventHandler(this.DeleteRow_Click);
вот крутая часть
private void MyDataGridView_MouseDown(object sender, MouseEventArgs e) { if(e.Button == MouseButtons.Right) { var hti = MyDataGridView.HitTest(e.X, e.Y); MyDataGridView.ClearSelection(); MyDataGridView.Rows[hti.RowIndex].Selected = true; } } private void DeleteRow_Click(object sender, EventArgs e) { Int32 rowToDelete = MyDataGridView.Rows.GetFirstRow(DataGridViewElementStates.Selected); MyDataGridView.Rows.RemoveAt(rowToDelete); MyDataGridView.ClearSelection(); }
для полноты этого вопроса, лучше использовать сетку, а не мышь.
Сначала установите свойства datagrid:
SelectionMode to FullRowSelect и RowTemplate / ContextMenuStrip в контекстное меню.
создать событие CellMouseDown:-
private void myDatagridView_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e) { if (e.Button == MouseButtons.Right) { int rowSelected = e.RowIndex; if (e.RowIndex != -1) { this.myDatagridView.Rows[rowSelected].Selected = true; } // you now have the selected row with the context menu showing for the user to delete etc. } }
private void dgvOferty_CellContextMenuStripNeeded(object sender, DataGridViewCellContextMenuStripNeededEventArgs e) { dgvOferty.ClearSelection(); int rowSelected = e.RowIndex; if (e.RowIndex != -1) { this.dgvOferty.Rows[rowSelected].Selected = true; } e.ContextMenuStrip = cmstrip; }
TADA: D. самый простой способ период. Для пользовательских ячеек просто немного изменить.
гораздо проще добавить только событие для mousedown:
private void MyDataGridView_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { var hti = MyDataGridView.HitTest(e.X, e.Y); MyDataGridView.Rows[hti.RowIndex].Selected = true; MyDataGridView.Rows.RemoveAt(rowToDelete); MyDataGridView.ClearSelection(); } }
это легче. Конечно, вы должны инициализировать свое mousedown-событие, как уже упоминалось:
this.MyDataGridView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MyDataGridView_MouseDown);
в конструкторе.
все ответы, поставленные в этом вопросе, основаны на событии щелчка мыши. Вы также можете назначить
ContenxtMenuStrip
наDataGridview
и проверить, если есть строка выбирается, когда пользователь RightMouseButtons наDataGridView
и решите, хотите ли вы просмотретьContenxtMenuStrip
или нет. Вы можете сделать это, установивCancelEventArgs.Cancel
стоимостью в открыть событие наContextMenuStrip
private void MyContextMenuStrip_Opening(object sender, CancelEventArgs e) { //Only show ContextMenuStrip when there is 1 row selected. if (MyDataGridView.SelectedRows.Count != 1) e.Cancel = true; }
но если у вас есть несколько полос контекстного меню, каждая из которых содержит разные варианты, в зависимости от выбора, я бы пошел на щелчок мыши-подход к себе.
base on @Data-Base ответ он не будет работать, пока не сделает режим выбора FullRow
MyDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
но если вам нужно заставить его работать в режиме CellSelect
MyDataGridView.SelectionMode = DataGridViewSelectionMode.CellSelect; // for cell selection private void MyDataGridView_MouseDown(object sender, MouseEventArgs e) { if(e.Button == MouseButtons.Right) { var hit = MyDataGridView.HitTest(e.X, e.Y); MyDataGridView.ClearSelection(); // cell selection MyDataGridView[hit.ColumnIndex,hit.RowIndex].Selected = true; } } private void DeleteRow_Click(object sender, EventArgs e) { int rowToDelete = MyDataGridView.Rows.GetFirstRow(DataGridViewElementStates.Selected); MyDataGridView.Rows.RemoveAt(rowToDelete); MyDataGridView.ClearSelection(); }
private void MyDataGridView_MouseDown(object sender, MouseEventArgs e) { if(e.Button == MouseButtons.Right) { MyDataGridView.ClearSelection(); MyDataGridView.Rows[e.RowIndex].Selected = true; } } private void DeleteRow_Click(object sender, EventArgs e) { Int32 rowToDelete = MyrDataGridView.Rows.GetFirstRow(DataGridViewElementStates.Selected); MyDataGridView.Rows.RemoveAt(rowToDelete); MyDataGridView.ClearSelection(); }
вы также можете сделать это немного проще, используя следующие внутри события код:
private void MyDataGridView_MouseDown(object sender, MouseEventArgs e) { if (e.Button == MouseButtons.Right) { rowToDelete = e.RowIndex; MyDataGridView.Rows.RemoveAt(rowToDelete); MyDataGridView.ClearSelection(); } }
см. здесь это можно сделать с помощью
DataGridView
RowTemplate
собственность.Примечание: этот код не проверял, но я использовал этот метод раньше.
// Create DataGridView DataGridView gridView = new DataGridView(); gridView.AutoGenerateColumns = false; gridView.Columns.Add("Col", "Col"); // Create ContextMenu and set event ContextMenuStrip cMenu = new ContextMenuStrip(); ToolStripItem mItem = cMenu.Items.Add("Delete"); mItem.Click += (o, e) => { /* Do Something */ }; // This makes all rows added to the datagridview use the same context menu DataGridViewRow defaultRow = new DataGridViewRow(); defaultRow.ContextMenuStrip = cMenu;
и там вы идете, так просто!
У меня есть новый обходной путь, чтобы прийти в том же результате, но с меньшим количеством кода. для Winforms... Вот пример на португальском языке Следуйте шаг за шагом
- создайте contextMenuStrip в своей форме и создайте один элемент
- подписать одно событие click (OnCancelarItem_Click) для этого contextMenuStrip
- создать событие 'UserDeletingRow' на gridview а теперь ... .. вы имитируете нажатие клавиши del from пользователь
вы не забыли включить удаление на gridview, верно?!