DataGridView に列がほとんどなく、行にデータがあります。ここにはいくつかの解決策がありましたが、それらを組み合わせることができません!
行を右クリックするだけで、行全体が選択され、行を削除するオプションを含むメニューが表示されます。オプションを選択すると、行が削除されます。
私はいくつかの試みをしましたが、何も機能せず、乱雑に見えます。私は何をすべきか?
DataGridView に列がほとんどなく、行にデータがあります。ここにはいくつかの解決策がありましたが、それらを組み合わせることができません!
行を右クリックするだけで、行全体が選択され、行を削除するオプションを含むメニューが表示されます。オプションを選択すると、行が削除されます。
私はいくつかの試みをしましたが、何も機能せず、乱雑に見えます。私は何をすべきか?
私は最終的にそれを解決しました:
Visual Studio で、"DeleteRow" という項目を含む ContextMenuStrip を作成します。
次に、DataGridView リンクで ContextMenuStrip
以下のコードを使用すると、機能するのに役立ちました。
this.MyDataGridView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MyDataGridView_MouseDown);
this.DeleteRow.Click += new System.EventHandler(this.DeleteRow_Click);
ここがクールな部分です
private void MyDataGridView_MouseDown(object sender, MouseEventArgs e)
{
if(e.Button == MouseButtons.Right)
{
var hti = MyDataGridView.HitTest(e.X, e.Y);
MyDataGridView.ClearSelection();
MyDataGridView.Rows[hti.RowIndex].Selected = true;
}
}
private void DeleteRow_Click(object sender, EventArgs e)
{
Int32 rowToDelete = MyDataGridView.Rows.GetFirstRow(DataGridViewElementStates.Selected);
MyDataGridView.Rows.RemoveAt(rowToDelete);
MyDataGridView.ClearSelection();
}
この質問を完了するには、マウスではなくグリッドイベントを使用することをお勧めします。
まず、データグリッドのプロパティを設定します。
SelectionModeをFullRowSelectに、RowTemplate/ContextMenuStripをコンテキストメニューに。
CellMouseDownイベントを作成します:-
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.
}
}
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.MyDataGridView.MouseDown += new System.Windows.Forms.MouseEventHandler(this.MyDataGridView_MouseDown);
あなたのコンストラクタで。
@Data-Base の回答に基づいて、選択モードを FullRow にするまで機能しません
MyDataGridView.SelectionMode = DataGridViewSelectionMode.FullRowSelect;
ただし、CellSelectモードで機能させる必要がある場合
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();
}
この質問に対する回答はすべて、マウス クリック イベントに基づいています。ContenxtMenuStrip
また、を に割り当てて、ユーザーが でRightMouseButtonsを押したDataGridview
ときに行が選択されているかどうかを確認し、 を表示するかどうかを決定することもできます。これを行うには、のOpening イベントで値を設定します。DataGridView
ContenxtMenuStrip
CancelEventArgs.Cancel
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;
}
しかし、いくつかのコンテキスト メニュー ストリップがあり、それぞれに選択内容に応じて異なるオプションが含まれている場合は、私自身もマウス クリック アプローチを使用します。
private void MyDataGridView_MouseDown(object sender, MouseEventArgs e)
{
if(e.Button == MouseButtons.Right)
{
MyDataGridView.ClearSelection();
MyDataGridView.Rows[e.RowIndex].Selected = true;
}
}
private void DeleteRow_Click(object sender, EventArgs e)
{
Int32 rowToDelete = MyrDataGridView.Rows.GetFirstRow(DataGridViewElementStates.Selected);
MyDataGridView.Rows.RemoveAt(rowToDelete);
MyDataGridView.ClearSelection();
}
private void dataGridView1_CellContextMenuStripNeeded(object sender,
DataGridViewCellContextMenuStripNeededEventArgs e)
{
if (e.RowIndex != -1)
{
dataGridView1.ClearSelection();
this.dataGridView1.Rows[e.RowIndex].Selected = true;
e.ContextMenuStrip = contextMenuStrip1;
}
}
DataGridView
RowTemplate
プロパティを使用して実行できる here を参照してください。
注: このコードはテストされていませんが、以前にこの方法を使用したことがあります。
// Create DataGridView
DataGridView gridView = new DataGridView();
gridView.AutoGenerateColumns = false;
gridView.Columns.Add("Col", "Col");
// Create ContextMenu and set event
ContextMenuStrip cMenu = new ContextMenuStrip();
ToolStripItem mItem = cMenu.Items.Add("Delete");
mItem.Click += (o, e) => { /* Do Something */ };
// This makes all rows added to the datagridview use the same context menu
DataGridViewRow defaultRow = new DataGridViewRow();
defaultRow.ContextMenuStrip = cMenu;
そして、それと同じくらい簡単です!
イベント コード内で次のコードを使用して、これを少し簡単にすることもできます。
private void MyDataGridView_MouseDown(object sender, MouseEventArgs e)
{
if (e.Button == MouseButtons.Right)
{
rowToDelete = e.RowIndex;
MyDataGridView.Rows.RemoveAt(rowToDelete);
MyDataGridView.ClearSelection();
}
}