2011-12-20 89 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; 
}