Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

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

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

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

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