ContextMenuは行に依存するため、ContextMenuが表示される前に右クリックしてdataGridViewの行を選択する必要があります。
私はこれを試しました:
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.Rows [CurrentRow.Index]を読み取ろうとすると、左クリックで選択された行のみが表示され、右クリックで選択された行は表示されません。
現在のセルを次のように設定してみてください(これにより、コンテキストメニュー項目が選択される前に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();
}
}
このスレッドは古いことに気づきました。1つ追加したかったのです。複数の行を選択してアクションを実行できるようにする場合は、右クリックしている行が既に選択されているかどうかを確認できます。このように、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);
}
}
}
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);
}
}
これは私が推測する正確な方法です
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;
}
}