我的WinForm C#應用程序中的MouseEvents出現問題。我想在我的應用程序上獲得所有鼠標點擊。 如何確定哪些控件已被點擊(我初學C#)哪個控件被點擊了?
回答
如果你正在做的Windows窗體,你有幾種選擇:?
Hook mouse event,並找出如果單擊後組件實際上使你的應用程序的一部分
可以聲明一個基類
MyComponent : Control
。該組件優先於MousClick
事件,並提出special event通知事實。您的應用中的每個控件都來自該控件,因此每個控件都會通知它發生的點擊。足夠將 訂閱到他們的事件並根據請求處理它們。
只是一對夫婦的想法...
你不得不將它們連接所有到相同的事件處理程序。這可以在相關控件的屬性窗口中完成。您也可以編寫自己的函數來遍歷控件樹並將函數綁定到它們的每個事件處理程序。
您可以用遞歸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
應始終引用激發該事件的控件。話雖如此,我可能只是附加個別事件處理程序,除非您需要將多個控件作爲一個組處理。
警告:上面的代碼是未經測試。
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));
}
唯一的缺點是你必須遍歷窗體上的每個控件。如果你有很多很多的控件可能會影響性能。我只是匆匆一個快速的表格,並給它一個測試,並按預期工作。你應該能夠改變它來做你需要的東西(例如特定容器中的物品等) – jsmith 2011-12-20 16:47:16
缺點是在啓動時,它應該是好的去。我對上述代碼的唯一評論是,將處理程序包裝在lambda表達式中似乎有點多餘。我假設編譯器會意識到這一點,但最好將處理程序直接附加到事件上。 – digitlworld 2011-12-20 17:02:38
是的,我同意,lambda表達式確實不是必需的。我已更新代碼以反映您的建議。 – jsmith 2011-12-20 17:37:16
對於第二個問題「如何確定哪個控件已被點擊?」每個控件都有可能在代碼中處理的事件。
最簡單的方法來知道什麼時候被點擊控制是附於從該控件的屬性來完成控制的點擊事件。您可能不得不點擊閃電圖標來查看事件。在偶數旁邊雙擊將創建一個空處理程序。
例如,如果你有一個簡單的形式與一個單一的鈕釦安裝單擊事件的形式和該按鈕會告訴你,當有一個點擊任何地方。在大多數情況下,按鈕點擊將是最有用的處理。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Click(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
}
}
這真的很簡單!
在你贏表格點擊事件,你加
// Here is a modified version of your code:
private void Form1_Click(object sender, EventArgs e)
{
var control = Form1.ActiveControl;
}
- 1. CheckedTextView的哪個部分被點擊了?
- 2. 哪個JLabel被點擊過?
- 3. 點擊了哪個按鈕?
- 4. 如何確定哪個按鈕被點擊了一段時間
- 5. 使事件的多個按鈕,並知道被點擊了哪個按鈕
- 6. 控制器看不到哪個按鈕被點擊
- 7. 檢查哪個按鈕被點擊
- 8. 如何定義哪個ListView被點擊?
- 9. 找到哪個視圖被點擊
- 10. 獲取哪個項目被點擊
- 11. vba按鈕 - 找到哪個被點擊
- 12. jQuery檢測哪個id被點擊
- 13. 找到哪個按鈕被點擊
- 14. 找到哪個li被點擊
- 15. JQuery:哪個元素被點擊?
- 16. Jquery驗證點擊了哪個圖像
- 17. QT - SvgDisplayWidget - 點擊了哪個ID?
- 18. 在Java中點擊了哪個按鈕?
- 19. 我點擊了哪個TD? jQuery的
- 20. 一個VerticalPanel的哪個部件已被點擊的GWT?
- 21. 更改圖標被點擊控件
- 22. Ajax控件工具包TabContainer - 如何確定哪個標籤被點擊?
- 23. 確定從宏(MS Word VBA)中點擊了哪個功能區控件
- 24. 檢查哪個用戶點擊了哪個鏈接
- 25. 如何確定在WPF UserControl中單擊了哪個控件?
- 26. 如何找出哪些網格行被點擊了contextmenu?
- 27. Android小部件:如何確定哪個按鈕被點擊?
- 28. 發生事件時點擊了哪個對象?
- 29. 如何檢查點擊了哪個小部件?
- 30. 確定哪個JavaFX ListView項目未被選中而被點擊
你嘗試過什麼?這取決於事件如何連接。事件處理程序的'sender'參數會告訴你什麼對象(控件)發送了事件,但這可能不是你想要的。 – 2011-12-20 16:31:04
到目前爲止,你有什麼...... – MethodMan 2011-12-20 16:31:13
對於剛開始使用Winforms編程的人來說,這是一個非常典型的問題。這在技術上是可行的,但WinForms很難達到目的。這不僅僅是它被設計使用的方式。你不應該關心*所有*點擊,只是你想給的意思。你可以通過編寫控件的Click事件處理程序來完成。確保至少按照教程,一本書是最好的。 – 2011-12-20 17:23:49