Щелкните правой кнопкой мыши, чтобы выбрать строку в 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);
}
}
это точный метод, я думаю,