0

C#Winformプロジェクト

私はcontextMenuを持つdataGridViewを持っています。簡単に言えば、必要がない場合でも(クリックしたときに)コンテキストメニューの選択がトリガーされることを除いて、すべてが希望どおりに機能しています。たとえば、dataGridViewを右クリックすると、選択内容が表示されます。これを選択すると、MouseClickイベントがトリガーされ、必要な処理が実行されます。しかし、クリックすると、MouseClickイベントがトリガーされます。

OnMouseUpイベントでいくつかの異なる方法で試しましたが、同じことが起こっています。以下のコードにいくつかの余分な「if」があります。これは基本的に、MouseClickが不必要にトリガーされないようにするためにいくつかのことを試みています(結局、冗長な作業を行っているだけだと思います)。

以下のコードでは、以下に注意してください。MessageBox.Show( "ここで問題が発生しました!");

コード:

private void dgvMyDataGridView_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        currentMouseOverCol = dgvMyDataGridView.HitTest(e.X, e.Y).ColumnIndex;
        currentMouseOverRow = dgvMyDataGridView.HitTest(e.X, e.Y).RowIndex;

        ContextMenu m = new ContextMenu();
        if (currentMouseOverRow >= 0 && currentMouseOverCol == 1)
        {
            dgvMyDataGridView.CurrentRow.Cells[0].Value.ToString())));
            m.MenuItems.Add(new MenuItem(string.Format("Do something with this row")));
        }

        m.Show(dgvMyDataGridView, new Point(e.X, e.Y));
    }

    DataGridView.HitTestInfo hitTestInfo;
    hitTestInfo = dgvMyDataGridView.HitTest(e.X, e.Y);

    if (hitTestInfo.Type == DataGridViewHitTestType.Cell && hitTestInfo.ColumnIndex == 1 && currentMouseOverRow >= 0 && currentMouseOverCol == 1)
    {
        MessageBox.Show("something goes wrong here!");
        // Code to open a new form page - this all works.
    }
}

クリックしたときにトリガーされないようにアプリケーションに指示するために何が欠けていますか?

ありがとう、

〜クリス

4

1 に答える 1

0

何が起こっているかというと、ContextMenu が閉じられた後もメソッドが処理を続けているということです。ソリューションを修正するには、ContextMenureturnを呼び出した後に行う必要があります。Show

簡単な修正:

m.Show(dgvMyDataGridView, new Point(e.X, e.Y));
return;

問題は、イベント ハンドラーの実行がまだ継続していて、コンテキスト メニューが閉じられたときにとの動作m.Showと同様に「終了」するのを待っていることでした。Form.ShowDialogMessageBox.Show

更新:コメントから、DataGridView.MouseClick が ContextMenu の項目をクリックしたユーザーを処理しようとしていたようです。このような場合、以下のようにコードを大幅に変更する必要があります。

private void dgvMyDataGridView_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right)
    {
        var hitTestInfo = dgvMyDataGridView.HitTest(e.X, e.Y);

        if ((hitTestInfo.Type == DataGridViewHitTestType.Cell) &&
            (hitTestInfo.ColumnIndex == 1) &&
            (hitTestInfo.RowIndex >= 0))
        {
            string currentCell = dgvMyDataGridView.Rows[hitTestInfo.RowIndex].Cells[hitTestInfo.ColumnIndex].Value.ToString();
            ContextMenu m = new ContextMenu();
            dgvMyDataGridView.CurrentRow.Cells[0].Value.ToString();
            m.MenuItems.Add(new MenuItem("Click Me!", new EventHandler((itemSender, itemEvent) =>
            {
                var result = MessageBox.Show("You've clicked " + currentCell + ". Open next form?", "Continue?", MessageBoxButtons.YesNo);
                if (result == System.Windows.Forms.DialogResult.Yes)
                {
                    // Code to open a new form page.
                }
            })));
            m.Show(dgvMyDataGridView, new Point(e.X, e.Y));
        }
    }
}

重要なのは、EventHandler を ContextMenu の MenuItem に追加することです。それが役立つことを願っています!

于 2012-07-25T19:09:04.667 に答える