2

特定の列を右クリックするDataGridViewと開くコンテキスト メニューがあります。コンテキスト メニューに表示される内容は、クリックしたフィールドの内容 (複数のファイルへのパス) に依存します (パスは、正しいファイルへの完全な UNC パスを作成するために操作されます)。

唯一の問題は、クリックが機能しないことです。ツールバーからコンテキスト メニューをドラッグ アンド ドロップするのではなく、プログラムで作成しました。

パスを取得できれば(それを と呼びましょうContextMenuChosen)に表示されるようMessageBox.Show(ContextMenuChosen);に設定できると考えましたSystem.Diagnostics.Process.Start(ContextMenuChosen);

以下の Mydgv_MouseUp イベントは、実際にMessageBox.Show("foo!");は、コンテキスト メニューで何かが選択されたときに起動できるところまで機能しますが、そこで終了します。パスの1つがクリックされたときに試したことを示すコメントを以下に残しました。空の文字列になるものもあれば、エラーになるものもあります (オブジェクトがインスタンスに設定されていません...)。

昨日一日中コードを検索しましたが、動的に構築されたコンテキスト メニューの clickEvent を接続する別の方法が見つかりませんでした。

コードとコメント:

    ContextMenu m = new ContextMenu();

    // SHOW THE RIGHT CLICK MENU
    private void Mydgv_MouseClick(object sender, MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right)
        {
            int currentMouseOverCol = Mydgv.HitTest(e.X, e.Y).ColumnIndex;
            int currentMouseOverRow = Mydgv.HitTest(e.X, e.Y).RowIndex;

            if (currentMouseOverRow >= 0 && currentMouseOverCol == 6)
            {
                string[] paths = myPaths.Split(';');
                foreach (string path in paths)
                {
                    string UNCPath = "\\\\1.1.1.1\\c$\\MyPath\\";
                    string FilePath = path.Replace("c:\\MyPath\\", @"");
                    m.MenuItems.Add(new MenuItem(UNCPath + FilePath));
                }
            }
            m.Show(Mydgv, new Point(e.X, e.Y));
        }
    }



    // SELECTING SOMETHING IN THE RIGHT CLICK MENU
    private void Mydgv_MouseUp(object sender, MouseEventArgs e)
    {
        DataGridView.HitTestInfo hitTestInfo;
        if (e.Button == MouseButtons.Right)
        {
            hitTestInfo = Mydgv.HitTest(e.X, e.Y);
            // If column is first column
            if (hitTestInfo.Type == DataGridViewHitTestType.Cell && hitTestInfo.ColumnIndex == 6)
            {
                //MessageBox.Show(m.ToString());
                ////MessageBox.Show(m.Tag.ToString());
                //MessageBox.Show(m.Name.ToString());
                //MessageBox.Show(m.MenuItems.ToString());
                ////MessageBox.Show(m.MdiListItem.ToString());
                // MessageBox.Show(m.Name);
                //if (m.MenuItems.Count > 0)
                //MessageBox.Show(m.MdiListItem.Text);
                //MessageBox.Show(m.ToString());
                //MessageBox.Show(m.MenuItems.ToString());
                //Mydgv.ContextMenu.Show(m.Name.ToString());
                //MessageBox.Show(ContextMenu.ToString());
                //MessageBox.Show(ContextMenu.MenuItems.ToString());
                //MenuItem.text
                //MessageBox.Show(this.ContextMenu.MenuItems.ToString());

            }

            m.MenuItems.Clear();
        }

    }

私はこれを完了するのに非常に近いので、どんな助けも大歓迎です。

4

2 に答える 2

2

メニュー項目に関連付けられたイベント ハンドラーが表示されないため、クリックすると何かが発生します。

void menu_Click(object sender, EventArgs e) {
  MessageBox.Show(((MenuItem)sender).Text);
}

次に、メニュー項目をコンテキスト メニューに追加するときにアタッチします。

  MenuItem mi = new MenuItem(UNCPath + FilePath);
  mi.Click += menu_Click;
  m.MenuItems.Add(mi);
于 2012-06-20T14:09:44.817 に答える
0

CellMouseDownあなたはあなたがあなたのときにこのように扱うかもしれませんright click a cell of a specific column。特定の列は、によって達成されますe.ColumnIndex check

GetCellDisplayRectangleさらに、 hittestの代わりに使用できます

ContextMenu cm = new ContextMenu();

void dataGridView1_CellMouseDown(object sender, DataGridViewCellMouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {

        if (e.ColumnIndex == 0)
        {
            cm.MenuItems.Clear();
            var mi = new MenuItem("C:\temp");
            mi.MenuItems.Add(mi);
            // handle menu item click event here [as required]
            mi.Click += OnMenuItemClick;
            cm.MenuItems.Add(0, mi);
            var bounds = dataGridView1.GetCellDisplayRectangle(e.ColumnIndex, e.RowIndex, false);
            if (sender != null)
            {
                cm.Show(sender as DataGridView, new Point(bounds.X, bounds.Y));
            }
        }
    }
}

 void OnMenuItemClick(object sender, EventArgs e)
 {
      MessageBox.Show(((MenuItem)sender).Text);
 }
于 2012-06-20T14:58:14.927 に答える