Щелкните правой кнопкой мыши, чтобы выбрать строку в Datagridview и показать меню для ее удаления.
У меня есть несколько столбцов в моем DataGridView, и в моих строках есть данные. Я видел здесь несколько решений, но я не могу их объединить!
Просто щелкнуть правой кнопкой мыши по строке, он выберет целую строку и покажет меню с возможностью удаления строки, и когда выбранная опция удалит строку.
Я сделал несколько попыток, но никто не работает, и это выглядит беспорядочно. Что мне делать?
Ответы
Ответ 1
Я наконец решил это:
Использование приведенного ниже кода помогло мне заставить его работать.
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();
}
Ответ 2
Для полноты этого вопроса лучше использовать событие Grid, а не мышь.
Сначала установите свойства вашей сетки данных:
SelectionMode для 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.ClearSelection();
this.myDatagridView.Rows[rowSelected].Selected = true;
}
// you now have the selected row with the context menu showing for the user to delete etc.
}
}
Ответ 3
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;
}
ТАДА: D. Самый простой путь. Для пользовательских ячеек немного измените.
Ответ 4
Гораздо проще добавить только событие для 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);
в вашем конструкторе.
Ответ 5
Все ответы на этот вопрос основаны на событии щелчка мыши. Вы также можете назначить 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;
}
Но если у вас есть несколько полосок контекстного меню, каждый из которых содержит разные параметры, в зависимости от выбора, я бы пошел и на мышиный подход, чтобы подойти сам.
Ответ 6
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();
}
Ответ 7
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();
}
Ответ 8
Вы также можете сделать это немного проще, используя следующее внутри кода события:
private void MyDataGridView_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
rowToDelete = e.RowIndex;
MyDataGridView.Rows.RemoveAt(rowToDelete);
MyDataGridView.ClearSelection();
}
}
Ответ 9
См. здесь, это можно сделать, используя свойство 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;
И вы идете, так же просто!
Ответ 10
У меня есть новый обходной путь, чтобы получить тот же результат, но с меньшим количеством кода. для Winforms... Этот пример на португальском Следуйте шаг за шагом
- Создайте contextMenuStrip в вашей форме и создайте один элемент
- Подписать одно событие клика (OnCancelarItem_Click) для этого contextMenuStrip
![enter image description here]()
- Создайте событие 'UserDeletingRow' в gridview
, и теперь... вы имитируете нажатие клавиши del от пользователя Вы не забыли включить удаление в сетке, верно?!
и наконец... ![enter image description here]()