我一直在寻找一些代码,这些代码告诉鼠标点击了什么控件。我有一个包含 50 多个控件的表单,我不想单击每个控件来单击鼠标。我该怎么做?
2 回答
您可以使用每个控件的Tag属性。因此,将其设置为有意义的内容,然后在 Click 事件中执行以下操作:
(sender As Control).Tag
编辑:你也可以这样做:
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
}
}
不过,我并不真正推荐这种方法,因为它违反了良好的面向对象设计。您必须编写代码来根据其独特属性确定哪个控件是哪个控件,而不是让运行时自动确定和处理它。