Right click to select a row in a Datagridview and show a menu to delete it

后端 未结 12 537
梦毁少年i
梦毁少年i 2020-12-02 12:00

I have few columns in my DataGridView, and there is data in my rows. I saw few solutions in here, but I can not combine them!

Simply a way to right-click on a row, i

相关标签:
12条回答
  • 2020-12-02 12:33

    I have a new workaround to come in same result, but, with less code. for Winforms... That's example is in portuguese Follow up step by step

    1. Create a contextMenuStrip in your form and create one item
    2. Sign one event click (OnCancelarItem_Click) for this contextMenuStrip
    3. Create a event 'UserDeletingRow' on gridview and now... you've simulating on key press del from user

      you don't forget to enable delete on the gridview, right?!

    and finally...

    0 讨论(0)
  • 2020-12-02 12:35

    base on @Data-Base answer it will not work until make selection mode FullRow

      MyDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
    

    but if you need to make it work in CellSelect Mode

     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();
    }
    
    0 讨论(0)
  • 2020-12-02 12:39

    All the answers posed in to this question are based on a mouse click event. You can also assign a ContenxtMenuStrip to your DataGridview and check if there is a row selected when the user RightMouseButtons on the DataGridView and decide whether you want to view the ContenxtMenuStrip or not. You can do so by setting the CancelEventArgs.Cancel value in the the Opening event of the 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;
        }
    

    But if you have several context menu strips, with each containing different options, depending on the selection, I would go for a mouse-click-approach myself as well.

    0 讨论(0)
  • 2020-12-02 12:42

    It's much more easier to add only the event for 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();
        }
    }
    

    This is easier. Of cource you have to init your mousedown-event as already mentioned with:

    this.MyDataGridView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MyDataGridView_MouseDown);
    

    in your constructor.

    0 讨论(0)
  • 2020-12-02 12:45
    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. The easiest way period. For custom cells just modify a little.

    0 讨论(0)
  • 2020-12-02 12:46

    For completness of this question, better to use a Grid event rather than mouse.

    First Set your datagrid properties:

    SelectionMode to FullRowSelect and RowTemplate / ContextMenuStrip to a context menu.

    Create the CellMouseDown event:-

    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.
        }
    }
    
    0 讨论(0)
提交回复
热议问题