Щелкните правой кнопкой мыши, чтобы выбрать строку в 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 для 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 в своей форме и создайте один элемент
- подписать один клик события (OnCancelarItem_Click) для этого contextMenuStrip
- создайте событие "UserDeletingRow" в gridview
а теперь..... вы имитируете нажатие клавиши del от пользователь
вы не забыли включить delete в gridview, верно?!