6

シンプルなドロップダウン スタイルの ComboBox があります。ユーザーがリスト内のアイテムを右クリックしたときに新しいウィンドウを開きたいのですが、右クリックが発生したことを検出するのに苦労しています。

私のコード:

private void cmbCardList_MouseClick(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Right && cmbCardList.SelectedIndex != -1)
    {
        frmViewCard vc = new frmViewCard();
        vc.updateCardDisplay(cmbCardList.SelectedItem);
        vc.Show();
    }
}

e.Button == MouseButtons.Left を変更すると、全体が問題なく起動します。これを意図したとおりに機能させる方法はありますか?

4

3 に答える 3

9

深刻なハッキングをしない限り、それは不可能だと思います。この記事では説明します。

あなたのために引用:

個別のコントロール

次のコントロールは、標準のマウス クリック イベントの動作に準拠していません。

Button、CheckBox、ComboBox、および RadioButton コントロール

  • 左クリック:クリック、マウスクリック

  • 右クリック: クリック イベントは発生しません

  • 左ダブルクリック: クリック、マウスクリック; クリック、マウスクリック

  • 右ダブルクリック: クリック イベントは発生しません

于 2009-10-17T07:18:24.597 に答える
6

この質問の碑文として、通常の .NET 機能を使用してこれを機能させることができます。イベント コール スタックをもう少し深く掘り下げる必要があります。MouseClick イベントを処理する代わりに、MouseDown イベントを処理します。最近、似たようなことをしなければならなかったので、ハンドラをアタッチする代わりに OnMouseDown メソッドをオーバーライドしました。ただし、ハンドラーも機能するはずです。コードは次のとおりです。

    protected override void OnMouseDown(MouseEventArgs e)
    {
        if (e.Button == MouseButtons.Right && !HandlingRightClick)
        {
            HandlingRightClick = true;
            if (!cmsRightClickMenu.Visible)
                cmsRightClickMenu.Show(this, e.Location);
            else cmsRightClickMenu.Hide();
        }
        base.OnMouseDown(e);
    }

    protected override void OnMouseUp(MouseEventArgs e)
    {
        HandlingRightClick = false;
        base.OnMouseUp(e);
    }

    private bool HandlingRightClick { get; set; }

HandlingRightClick プロパティは、OnMouseDown ロジックの複数のトリガーを防ぐためのものです。UI は複数の MouseDown メッセージを送信し、右クリック メニューの非表示を妨げる​​可能性があります。これを防ぐために、最初の MouseDown トリガーでロジックを 1 回だけ実行し (ロジックは単純なので、2 つの呼び出しが競合しても気にしませんが、競合する可能性があります)、MouseUp が発生するまで他のすべての MouseDown トリガーを無視します。完璧ではありませんが、これで必要なことができます。

于 2011-08-12T19:07:51.400 に答える
0

ContextMenuStripのOpeningイベントを使用して、右クリック イベントを処理できます。

var chk = new CheckBox();
chk.ContextMenuStrip = cmsNone;

private void cmsNone_Opening(object sender, CancelEventArgs e)
{
    e.Cancel = true;
    var cms = (ContextMenuStrip)sender;
    var chk = cms.SourceControl;
    //do your stuff
}
于 2013-10-14T07:14:13.863 に答える