Щелкните правой кнопкой мыши, чтобы выбрать строку в 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... Это пример на португальском языке Следуйте шаг за шагом

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

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

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