Щелкните правой кнопкой мыши, чтобы выбрать DataGrid Row не работает - PullRequest
0 голосов
/ 08 июня 2018

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

Похоже, что строка выбрана, но, если сначала щелкнуть левой кнопкой мыши по строке, первая строка всегда будет выбранной строкой при выборе действия.т.е. когда я щелкаю по редактированию в строке 3, данные строки 1 будут переданы в форму редактирования (если я не щелкну левой кнопкой мыши по строке 3, прежде чем щелкнуть по ней правой кнопкой мыши)

Это меню, вызываемое правой кнопкой мыши и показывающее очевидный выбор:

enter image description here

Обратите внимание, что маленький индикатор все еще находится в первой строке.

Если я закрываю контекстное меню, строка выглядит выделенной, ноэто не:

enter image description here

Если я щелкну левой кнопкой мыши по той же строке, она будет выбрана

enter image description here

Вот код для события щелчка правой кнопкой мыши:

Код дизайнера:

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

Код формы:

private void MyDataGridView_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {       
        var hti = MyDataGrid.HitTest(e.X, e.Y);
        MyDataGrid.CurrentCell = MyDataGrid.Rows[hti.RowIndex].Cells[hti.ColumnIndex];
    }
}

Что яне хватает на самом деле выбрать строку?

Ответы [ 3 ]

0 голосов
/ 08 июня 2018

Вы можете сделать щелчок правой кнопкой мыши на выделенной строке в событии CellMouseDown, как это

if (e.Button == System.Windows.Forms.MouseButtons.Right)
{
     DataGridView1.CurrentCell = DataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
}
0 голосов
/ 08 июня 2018

Замените ваш код в обратном вызове события MouseDown следующим:

private void dataGridView1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        var hti = dataGridView1.HitTest(e.X, e.Y);

        if (hti.RowIndex != -1)
        {
            dataGridView1.ClearSelection();
            dataGridView1.Rows[hti.RowIndex].Selected = true;
            dataGridView1.CurrentCell = dataGridView1.Rows[hti.RowIndex].Cells[0];
        }
    }
}

Вот демонстрация его работы:

enter image description here

0 голосов
/ 08 июня 2018

Это потому, что щелчок правой кнопкой мыши фактически не выбирает ячейку, по которой вы щелкнули правой кнопкой мыши, только щелчок левой кнопкой мыши делает это.Вам нужно добавить обработчик для события мыши с ячейкой, добавьте это в конструктор вашей формы:

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

и добавьте это в класс вашей формы:

private void MyDataGridView_MouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    MyDataGridView.CurrentCell = MyDataGridView(e.ColumnIndex, e.RowIndex);
}

Это установитCurrentCell aka Ячейка, которая в данный момент выбрана для того, над какой ячейкой находился курсор, когда вызывалось событие MouseDown.

...