2009-06-01 3 views
4

現在、カスタムコントロールを開発中で、自分のコードが2回実行されていることに気付きました。それは実際には大きな問題ではありません(Focusメソッド呼び出しのみです)。しかし、私はそれを理解したいと思います。C#を使用してWindowsフォームアプリケーションでOnClickとMouseClickのイベントを正しく使用する

MSDN description for click | onclick eventを読んでから、その状態:ユーザーがオブジェクト上でマウスの左ボタンをクリックしたときに

火を。

左クリックと右クリックの両方を処理するOnClickイベントとMouseClickイベントを追加しました。しかし、コードをデバッグした後、OnClickが左右のクリックイベントを処理することがわかりました。

なぜOnClickは両方を処理するのですか何らかの理由で両方のイベントを自分のコードに保存する必要がありますか?

protected override void OnClick(EventArgs e) 
{ 

    this.Focus(); 
    base.OnClick(e); 
} 

private void CustomControl_MouseClick(object sender, MouseEventArgs e) 
{  
    if (e.Button == MouseButtons.Right) 
    { 
     rightClickMenu(e); 
    } 
} 
+0

なぜクリック/ MouseClick内でフォーカスを呼び出すのですか?また、あなたのリンクは、html要素のクリックイベント&winformsのためのものではありません。 – shahkalpesh

+0

私はそれがカスタムコントロールに必要と仮定しました。もしそうでなければ、私は研究し、いつ起こるかを見るでしょう。それとも、自分でそれを呼び出さなければならないのか。 AHHHはリンク上のhtml要素をキャッチしませんでした...私は約2インチの高さを感じています!助けてくれてありがとう! – Billy

+1

Windowsフォームでは、クリックイベントを処理する方法として、MouseClickとClickの2つの方法があります。 –

答えて

11

According to MSDNの場合、Clickイベントは、マウスをクリックしたときだけでなく、Enterボタンを押したときにも呼び出されます。マウスクリックだけを処理する必要がある場合は、すべてのコードをMouseClickイベントで移動します。クリックイベントがクリックされたマウスボタン(もしあれば)を教えてくれないので、別の方法で行うことはできません。あなたがイベントにアタッチしたいどのように多くの方法ができ

0

あなたは両方のイベントを持つ必要はありません... OnClickを維持してください。

また、私はかなり長い間Windowsフォームを作成していませんが、手動でクリックイベントを設定するよりもフォーカスを受け入れる方が良いと思いますが、具体的に何かを伝えることはできません。私はそれに何かの財産があると思う。

+1

ほとんどのコントロールで、ユーザーがクリックした場合、コントロールにはすでにウィンドウフォーカスが設定されています。 –

+0

彼はマウスの右ボタンがクリックされたかどうかを確認する必要があり、このイベントで知る方法がないため、OnClickを保持することはできません。 –

0

Winformsでは、いずれかのマウスキーをクリックするとClickイベントが発生します。

-3

のOnClickとCustomControl_MouseClick が同じイベント

です(this.Click + = ...)すべての

+1

いいえ、ClickとMouseClickは異なるイベントです。 Control.OnClick呼び出しイベントハンドラーをクリックし、Control.OnMouseClickはMouseClickイベントハンドラーを呼び出します。 – nightcoder

6

まず、あなたのリンク間違っていると、WinFormsではなくHTMLおよびDHTMLリファレンスにリンクしています。 正しいリンクはControl.MouseClick event
正しいメソッドは1つだけオーバーライドする必要があります。マウスクリックのみを処理する場合は、OnMouseClick()をオーバーライドし、MouseClickイベントを処理しない場合はOnClick()をオーバーライドし、OnMouseClick()をオーバーライドしないでください。

0

私の記憶が私の右に役立つならば、クリックしてマウスキーを押しながら 'Enter'キーを押すか、「Tab」キーを使用してコントロールにフォーカスを設定し、「Space」または「Enter」を使ってそれをクリックします。

このような動作が許容される/希望される場合は、次の操作を行うことができます。

私はDoubleClickイベントのために、この回避策を持っていた...

void ControlClick(object sender, EventArgs e) 
{ 
    MouseEventArgs mEvt=e as MouseEventArgs; // or (MouseEventArgs)e; 

    // now mEvt has the same properties as 'e' in MouseClick event 
} 

・ホープ、このことができます。

-Nurchi

関連する問題