4

ユーザーは DGV 内のセルを右クリックし、ContextMenuStrip で選択を行います。彼らの CMS の選択に基づいて、何かをしたい (コピー、非表示、フィルター)。私の問題は、右クリックされたセルを識別することです。

以下の方法で対処しようとしたのですが、[ColumnIndex]が参照できません。

private void cmsDataGridView_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
    {
        switch (e.ClickedItem.Text)
        {
            case "Copy":
                break;
            case "Filter On":
                break;
            case "Hide Column":
                DataGridViewBand band = dataGridView1.Columns[e.ColumnIndex];
                band.Visible = false;
                break;
        }
    }

これを2つの異なる方法で行う必要がありますか? 1 つはマウス クリックを処理するもので (DGV 列のインデックスを取得できます)、そこから CMS アイテムのクリック イベントを呼び出しますか?

助けてくれてありがとう、ブライアン。


私のために働くコード。ああ、デザイナー内の dataGridView の ContextMenuStrip プロパティから cmsDataGridView メソッドを削除する必要がありました。そこに放置すると問題が発生しました。

            // Identify the cell clicked for cmsDataGridView
    DataGridViewCell clickedCell;
    private void dataGridView1_CellMouseClick(object sender, DataGridViewCellMouseEventArgs e)
    {
        try
        {
            if (e.Button == MouseButtons.Right)
            {
                dataGridView1.ClearSelection();
                clickedCell = dataGridView1.Rows[e.RowIndex].Cells[e.ColumnIndex];
                clickedCell.Selected = true;
                cmsDataGridView.Show(dataGridView1, e.Location);
            }

        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
        }
    }

    private void cmsDataGridView_ItemClicked(object sender, ToolStripItemClickedEventArgs e)
    {
        switch (e.ClickedItem.Text)
        {
            case "Copy":
                break;
            case "Filter On":
                break;
            case "Hide Column":
                DataGridViewBand band = dataGridView1.Columns[clickedCell.ColumnIndex];
                band.Visible = false;
                break;
        }
    }
4

2 に答える 2

7

DataGridView のマウス クリックのイベント ハンドラーを追加することで、最後にクリックされたセルを追跡できます。

何かのようなもの:

    DataGridViewCell clickedCell;

    private void dataGridView1_CellMouseClick_1(object sender, DataGridViewCellMouseEventArgs e)
{
        try
    {
        DataGridView view = (DataGridView)sender;

        if (e.Button == System.Windows.Forms.MouseButtons.Right && e.RowIndex >= 0)
        {
            Console.WriteLine("Clicked column " 
                       + e.ColumnIndex + ", row " 
                       + e.RowIndex + " of DataGridView " 
                       + view.Name + " at " 
                       + System.Windows.Forms.Cursor.Position);

           clickedCell = view.Rows[e.RowIndex].Cells[e.ColumnIndex];
        }
    }
    catch (Exception ex)
    {
        Console.WriteLine(ex.Message + Environment.NewLine + ex.StackTrace);
    }
}

次に、contextMenuStripItem クリック イベントで、次のように clickedCell.Value をオンにします。

switch (clickedCell.Value)
        {
            case "Copy":
            break;
... // etc.
}
于 2013-05-22T22:34:37.523 に答える