2011-12-20 87 views
1

我的WinForm C#應用程序中的MouseEvents出現問題。我想在我的應用程序上獲得所有鼠標點擊。 如何確定哪些控件已被點擊(我初學C#)哪個控件被點擊了?

+2

你嘗試過什麼?這取決於事件如何連接。事件處理程序的'sender'參數會告訴你什麼對象(控件)發送了事件,但這可能不是你想要的。 – 2011-12-20 16:31:04

+0

到目前爲止,你有什麼...... – MethodMan 2011-12-20 16:31:13

+4

對於剛開始使用Winforms編程的人來說,這是一個非常典型的問題。這在技術上是可行的,但WinForms很難達到目的。這不僅僅是它被設計使用的方式。你不應該關心*所有*點擊,只是你想給的意思。你可以通過編寫控件的Click事件處理程序來完成。確保至少按照教程,一本書是最好的。 – 2011-12-20 17:23:49

回答

0

如果你正在做的Windows窗體,你有幾種選擇:?

  1. Hook mouse event,並找出如果單擊後組件實際上使你的應用程序的一部分

  2. 可以聲明一個基類MyComponent : Control。該組件優先於MousClick事件,並提出special event通知事實。您的應用中的每個控件都來自該控件,因此每個控件都會通知它發生的點擊。足夠將 訂閱到他們的事件並根據請求處理它們。

只是一對夫婦的想法...

0

你不得不將它們連接所有到相同的事件處理程序。這可以在相關控件的屬性窗口中完成。您也可以編寫自己的函數來遍歷控件樹並將函數綁定到它們的每個事件處理程序。

您可以用遞歸foreach循環遍歷Form.Controls集合。

void attachGlobalHandler(Control aToParse, EventHandler aGlobalHandler) 
{ 
    foreach(Control lControl in aToParse.Controls) 
    { 
     attachGlobalHandler(lControl, aGlobalHandler); 
     lControl.Click += aGlobalHandler; 
    } 
} 

然後調用你的表格上,你要調用的函數的名稱:

attachGlobalHandler(Form1, myClickHandler); 

,並應比分扳成EVERY點擊窗體上的控制。該處理程序的參數sender應始終引用激發該事件的控件。話雖如此,我可能只是附加個別事件處理程序,除非您需要將多個控件作爲一個組處理。

警告:上面的代碼是未經測試。

0
private void Form1_Load(object sender, EventArgs e) 
    { 
     SetupClickEvents(this); 
    } 

    /// <summary> 
    /// This will loop through each control within the container and add a click handler to it 
    /// </summary> 
    /// <param name="container">The container whose children to handle clicks for</param> 
    private void SetupClickEvents(Control container) 
    { 
     foreach(Control control in container.Controls) 
     { 
      control.Click += HandleClicks; 
     } 
    } 
    private void HandleClicks(object sender, EventArgs e) 
    { 
     Control control = (Control)sender; 
     MessageBox.Show(string.Format("{0} was clicked!", control.Name)); 
    } 
+0

唯一的缺點是你必須遍歷窗體上的每個控件。如果你有很多很多的控件可能會影響性能。我只是匆匆一個快速的表格,並給它一個測試,並按預期工作。你應該能夠改變它來做你需要的東西(例如特定容器中的物品等) – jsmith 2011-12-20 16:47:16

+0

缺點是在啓動時,它應該是好的去。我對上述代碼的唯一評論是,將處理程序包裝在lambda表達式中似乎有點多餘。我假設編譯器會意識到這一點,但最好將處理程序直接附加到事件上。 – digitlworld 2011-12-20 17:02:38

+0

是的,我同意,lambda表達式確實不是必需的。我已更新代碼以反映您的建議。 – jsmith 2011-12-20 17:37:16

0

對於第二個問題「如何確定哪個控件已被點擊?」每個控件都有可能在代碼中處理的事件。

最簡單的方法來知道什麼時候被點擊控制是附於從該控件的屬性來完成控制的點擊事件。您可能不得不點擊閃電圖標來查看事件。在偶數旁邊雙擊將創建一個空處理程序。

例如,如果你有一個簡單的形式與一個單一的鈕釦安裝單擊事件的形式和該按鈕會告訴你,當有一個點擊任何地方。在大多數情況下,按鈕點擊將是最有用的處理。

public partial class Form1 : Form 
{ 
    public Form1() 
    { 
     InitializeComponent(); 
    } 

    private void Form1_Click(object sender, EventArgs e) 
    { 

    } 

    private void button1_Click(object sender, EventArgs e) 
    { 

    } 
} 
5

試試這個:

private void Control_Clicks(object sender, EventArgs e) 
{ 
    Control control = (Control)sender; // Sender gives you which control is clicked. 
    MessageBox.Show(control.Name.ToString()); 
} 

Thisthisthis可能會有幫助。

希望它有幫助。

0

這真的很簡單!

在你贏表格點擊事件,你加

// Here is a modified version of your code: 
private void Form1_Click(object sender, EventArgs e) 
{ 
    var control = Form1.ActiveControl; 
}