我如何判断鼠标被点击在哪个控件上?

本文关键字:控件 何判断 判断 鼠标 | 更新日期: 2023-09-27 18:06:50

我一直在寻找一些代码来告诉鼠标点击了什么控件。我有一个超过50个控件的表单,我不想点击每一个使鼠标点击。我该怎么做呢?

我如何判断鼠标被点击在哪个控件上?

可以使用每个控件的Tag属性。因此将它设置为有意义的内容,然后在Click事件中执行如下操作:

(sender As Control).Tag

EDIT:你也可以这样做:

foreach (Control item in this.Controls)     //this IS YOUR CURRENT FORM
{
    if ((sender as Control).Equals(item))
    {
        //Do what you want
    }
}

方法一:个性化处理

鼠标单击事件实际上将被单击鼠标的控件接收,因此您唯一需要做的就是处理该控件的MouseClick事件。如果你想让鼠标点击对每个控件做一些不同的操作,这是有意义的。

这只是您应该已经熟悉的基本事件处理策略。事件处理程序方法可以使用设计器或通过代码手动连接,如下所示:

private void myControl_MouseClick(object sender, MouseEventArgs e)
{
   // do something when the myControl control is clicked
}

方法二:综合处理

如果您希望在多个控件上具有相同的行为,您将连接一个事件处理程序方法来处理多个控件的MouseClick事件。然后,在事件处理程序方法内部,您将使用sender参数来识别被单击的控件。例如,您可以将sender转换为Control对象并测试Name属性的值。

如果您希望某种类型的所有控件以某种方式运行,而另一种类型的所有控件以另一种方式运行,您可以使用两个事件处理程序方法,并根据类型相应地将控件连接起来。

最简单的方法是通过代码连接事件处理程序方法。设计器是可行的,但如果将其用于每个控件就会显得过于乏味。例如,在表单的构造函数中,可以遍历所有控件并连接事件处理程序:
public MyForm()
{
   this.InitializeComponent();
   // Wire up your event handlers.
   foreach (Control ctrl in this.Controls)
   {
      if (ctrl is Label)
      {
         // Wire all Label controls up to do one thing.
         ctrl.MouseClick += new MouseEventHandler(LabelControls_MouseClick);
      }
      else if (ctrl is Button)
      {
         // Wire up all Button controls to do another thing.
         ctrl.MouseClick += new MouseEventHandler(ButtonControls_MouseClick);
      }
      else
      {
         // And wire up the rest of the controls to do a third thing.
         ctrl.MouseClick += new MouseEventHandler(OtherControls_MouseClick);
      }
   }
}
private void LabelControls_MouseClick(object sender, MouseEventArgs e)
{
   // do something when a Label control is clicked
}
private void ButtonControls_MouseClick(object sender, MouseEventArgs e)
{
   // do something when a Button control is clicked
}
private void OtherControls_MouseClick(object sender, MouseEventArgs e)
{
   // do something when a control other than a Label or Button is clicked
}

方法三:全局处理

如果您已经使所有这些控件透明(即,对鼠标事件透明,而不是视觉透明),以便鼠标单击事件在更高级别(即,由您的表单)进行处理,您可以使用Control.GetChildAtPoint方法来确定被单击的控件。您只需指定单击鼠标所在位置的坐标,该方法将返回位于该点的子控件(如果有的话)。

private void myForm_MouseClick(object sender, MouseEventArgs e)
{
   Control ctrl = Control.GetChildAtPoint(e.Location);
   if (ctrl != null)
   {
      // do something with the clicked control
   }
   else
   {
      // if ctrl is null, then the parent form itself was clicked,
      // rather than one of its child controls
  }
}
但是,我并不推荐这种方法,因为它违背了良好的面向对象设计。您必须编写代码来根据其独特属性确定哪个控件是哪个控件,而不是让运行时自动确定和处理。