Щелкните правой кнопкой мыши, чтобы выбрать строку в Datagridview и показать меню для ее удаления


У меня есть несколько столбцов в моем DataGridView, и есть данные в моих строках. Я видел несколько решений, но я не могу их совместить!

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

Я сделал несколько попыток, но никто не работает, и это выглядит грязно. Что же мне делать?

10 52

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

см. здесь это можно сделать с помощью DataGridViewRowTemplate собственность.

Примечание: этот код не проверял, но я использовал этот метод раньше.

// 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... Вот пример на португальском языке Следуйте шаг за шагом

  1. создайте contextMenuStrip в своей форме и создайте один элемент
  2. подписать одно событие click (OnCancelarItem_Click) для этого contextMenuStrip enter image description here
  3. создать событие 'UserDeletingRow' на gridview enter image description here а теперь ... .. вы имитируете нажатие клавиши del from пользователь

    вы не забыли включить удаление на gridview, верно?!

enter image description here enter image description here и, наконец,... enter image description here