Щелкните правой кнопкой мыши, чтобы выбрать строку в dataGridView

мне нужно выбрать строку в dataGridView с правой кнопкой мыши перед показанным ContextMenu, потому что contextMenu зависит от строки.

Я попытался это:

 if (e.Button == MouseButtons.Right)
        {

            var hti = dataGrid.HitTest(e.X, e.Y);
            dataGrid.ClearSelection();
            dataGrid.Rows[hti.RowIndex].Selected = true;
        }

или:

private void dataGrid_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            dataGrid.Rows[e.RowIndex].Selected = true;
            dataGrid.Focus();
        }
    }

это работает, но когда я пытаюсь прочитать dataGrid.Строк[CurrentRow.Index] я вижу только строку, выбранную с помощью левого клика, а не те, которые выбраны с помощью правого клика..

4 ответов


попробуйте установить текущую ячейку следующим образом (это установит CurrentRow свойства DataGridView перед выбором пункта контекстного меню):

    private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            // Add this
            dataGrid.CurrentCell = dataGrid.Rows[e.RowIndex].Cells[e.ColumnIndex]; 
            // Can leave these here - doesn't hurt
            dataGrid.Rows[e.RowIndex].Selected = true; 
            dataGrid.Focus();
        }

    }

Я понимаю, что этот поток старый, я просто хотел добавить одну вещь: если вы хотите иметь возможность выбирать и выполнять действие в нескольких строках: вы можете проверить, выбрана ли строка, которую вы щелкаете правой кнопкой мыши. Таким образом, DataGridview ведет себя как ListView в этом отношении. Поэтому щелкните правой кнопкой мыши на строке, еще не выбранной: выберите эту строку и откройте контекстное меню. Щелчок правой кнопкой мыши по уже выбранной строке дает вам контекстное меню и сохраняет выбранные строки как ожидаемый.

 private void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
    {
        if (e.RowIndex != -1 && e.ColumnIndex != -1)
        {
            if (e.Button == MouseButtons.Right)
            {
                DataGridViewRow clickedRow = (sender as DataGridView).Rows[e.RowIndex]; 
                if (!clickedRow.Selected)
                    dataGridView1.CurrentCell = clickedRow.Cells[e.ColumnIndex];

                var mousePosition = dataGridView1.PointToClient(Cursor.Position);

                ContextMenu1.Show(dataGridView1, mousePosition);
            }
        }
    }

    private void grid_listele_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            grid_listele.ClearSelection();
            grid_listele[e.ColumnIndex, e.RowIndex].Selected = true;
        }


    }

 if (e.Button == System.Windows.Forms.MouseButtons.Right)
        {
            var hti = GridView.HitTest(e.X, e.Y);
            GridView.ClearSelection();

            int index = hti.RowIndex;

            if (index >= 0)
            {
                GridView.Rows[hti.RowIndex].Selected = true;
                LockFolder_ContextMenuStrip.Show(Cursor.Position);
            }

        }

это точный метод, я думаю,