64

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

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

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

4

12 に答える 12

110

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

  • 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();
}
于 2010-06-14T07:10:05.663 に答える
40

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

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

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.
    }
}
于 2012-03-22T10:33:08.930 に答える
3

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

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

于 2011-09-24T12:51:43.223 に答える
2

@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();
}
于 2016-10-29T18:25:45.737 に答える
2

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

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

しかし、いくつかのコンテキスト メニュー ストリップがあり、それぞれに選択内容に応じて異なるオプションが含まれている場合は、私自身もマウス クリック アプローチを使用します。

于 2013-10-28T12:52:36.643 に答える
1
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();
}
于 2010-12-15T11:22:41.070 に答える
1
private void dataGridView1_CellContextMenuStripNeeded(object sender, 
DataGridViewCellContextMenuStripNeededEventArgs e)
{            
    if (e.RowIndex != -1)
    {
        dataGridView1.ClearSelection();
        this.dataGridView1.Rows[e.RowIndex].Selected = true;
        e.ContextMenuStrip = contextMenuStrip1;
    }
}
于 2019-11-04T15:05:21.233 に答える
0

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;

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

于 2013-05-04T01:08:32.000 に答える
0

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

private void MyDataGridView_MouseDown(object sender, MouseEventArgs e) 
{     
    if (e.Button == MouseButtons.Right)     
    {         
        rowToDelete = e.RowIndex;
        MyDataGridView.Rows.RemoveAt(rowToDelete);         
        MyDataGridView.ClearSelection();     
    } 
}
于 2012-05-14T17:23:44.700 に答える