Щелкните правой кнопкой мыши, чтобы выбрать строку в Datagridview и показать меню, чтобы удалить ее - PullRequest
57 голосов
/ 14 июня 2010

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

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

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

Ответы [ 10 ]

97 голосов
/ 14 июня 2010

Я наконец решил это:

  • В 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();
}
32 голосов
/ 22 марта 2012

Для полноты этого вопроса лучше использовать событие 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.
    }
}
8 голосов
/ 05 мая 2015
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. Самый простой способ периода. Для пользовательских ячеек просто измените немного.

3 голосов
/ 24 сентября 2011

Гораздо проще добавить только событие для 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);

в вашем конструкторе.

2 голосов
/ 29 октября 2016

на основе ответа @ 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();
}
2 голосов
/ 28 октября 2013

Все ответы на этот вопрос основаны на событии щелчка мыши.Вы также можете присвоить 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;
    }

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

1 голос
/ 15 декабря 2010
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();
}
0 голосов
/ 03 февраля 2018

У меня есть новый обходной путь, чтобы получить тот же результат, но с меньшим количеством кода.для Winforms ... Это пример на португальском языке. Следуйте шаг за шагом

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

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

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

0 голосов
/ 04 мая 2013

Смотрите здесь, это можно сделать с помощью свойства 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;

И вот так легко!

0 голосов
/ 14 мая 2012

Вы также можете сделать это немного проще, используя следующий код события:

private void MyDataGridView_MouseDown(object sender, MouseEventArgs e) 
{     
    if (e.Button == MouseButtons.Right)     
    {         
        rowToDelete = e.RowIndex;
        MyDataGridView.Rows.RemoveAt(rowToDelete);         
        MyDataGridView.ClearSelection();     
    } 
}
...