web-dev-qa-db-ja.com

Datagridviewで行を右クリックして選択し、削除するメニューを表示します

DataGridViewにいくつかの列があり、行にデータがあります。私はここでいくつかの解決策を見ましたが、それらを組み合わせることができません!

単に行を右クリックする方法で、行全体を選択し、行を削除するオプションを含むメニューを表示し、オプションが選択されると行を削除します。

私はいくつかの試みをしましたが、どれも機能せず、面倒に見えます。私は何をすべきか?

59
Data-Base

私は最終的にそれを解決しました:

  • 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();
}
98
Data-Base

この質問を完了するには、マウスではなくグリッドイベントを使用することをお勧めします。

最初にデータグリッドのプロパティを設定します。

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.
    }
}
35
peterincumbria
private void dgvOferty_CellContextMenuStripNeeded(object sender, DataGridViewCellContextMenuStripNeededEventArgs e)
    {
        dgvOferty.ClearSelection();
        int rowSelected = e.RowIndex;
        if (e.RowIndex != -1)
        {
            this.dgvOferty.Rows[rowSelected].Selected = true;
        }
        e.ContextMenuStrip = cmstrip;
    }

多田:D。最も簡単な方法の期間。カスタムセルの場合は、少し変更するだけです。

8
Cooler

マウスダウンのイベントのみを追加する方がはるかに簡単です。

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);

あなたのコンストラクタで。

3
Christian Herz

この質問に対するすべての回答は、マウスクリックイベントに基づいています。 ContenxtMenuStripDataGridviewに割り当てて、ユーザーRightMouseButtonsがオンのときに行が選択されているかどうかを確認することもできます。 DataGridViewを選択し、ContenxtMenuStripを表示するかどうかを決定します。 ContextMenuStripの-​​ Opening eventCancelEventArgs.Cancel値を設定することにより、これを行うことができます。

    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;
    }

しかし、複数のコンテキストメニューストリップがあり、それぞれが選択に応じて異なるオプションを含む場合は、マウスクリックでアプローチすることもできます。

2
Mike de Klerk

@ 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();
}
2
Hisham
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();
}
1
Nosic

同じ結果が得られる新しい回避策がありますが、コードは少なくなります。 Winformsの場合...それはポルトガル語の例です。

  1. フォームにcontextMenuStripを作成し、1つのアイテムを作成します
  2. このcontextMenuStripの1つのイベントクリック(OnCancelarItem_Click)に署名 enter image description here
  3. Gridviewにイベント 'UserDeletingRow'を作成します enter image description here そして今...あなたはユーザーからのキー押下delをシミュレートしています

    グリッドビューで削除を有効にすることを忘れないでください!

enter image description hereenter image description here そして最後に... enter image description here

0
Marinpietri

DataGridViewRowTemplateプロパティを使用して実行できます。

注:このコードはテストされていませんが、以前にこのメソッドを使用したことがあります。

// 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;

そして、それと同じくらい簡単です!

0
Zach Johnson

また、イベントコード内で次のコードを使用することで、これを少し簡単にすることもできます。

private void MyDataGridView_MouseDown(object sender, MouseEventArgs e) 
{     
    if (e.Button == MouseButtons.Right)     
    {         
        rowToDelete = e.RowIndex;
        MyDataGridView.Rows.RemoveAt(rowToDelete);         
        MyDataGridView.ClearSelection();     
    } 
}
0
JoBaxter