已单击哪个控件
本文关键字:控件 单击 | 更新日期: 2023-09-27 18:18:20
我在WinForm c#应用程序中遇到了MouseEvents问题。我想让所有的鼠标点击我的应用程序。如何确定哪个控件被点击了?(我是c#初学者)
试试这个:
private void Control_Clicks(object sender, EventArgs e)
{
Control control = (Control)sender; // Sender gives you which control is clicked.
MessageBox.Show(control.Name.ToString());
}
这个,这个或这个可能有帮助。
希望能有所帮助。
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));
}
如果你在做Windows窗体,你有几个选择:
-
钩子鼠标事件,然后找出被点击的组件是否真的是你的应用程序的一部分
-
可以声明一个基类
MyComponent : Control
。该组件覆盖MousClick
事件并引发一个通知事实的特殊事件。app中的每个控件都来自那个控件,所以每个控件都会通知点击发生在它上面。订阅就足够了到它们的事件,并按要求处理它们。
只是一些想法…
您必须将它们都连接到同一个事件处理程序。这可以在相关控件的属性窗口中完成。您还可以编写自己的函数来遍历控制树,并将该函数绑定到它们的每个事件处理程序。
您可以递归地遍历表单。用foreach循环控制集合。
void attachGlobalHandler(Control aToParse, EventHandler aGlobalHandler)
{
foreach(Control lControl in aToParse.Controls)
{
attachGlobalHandler(lControl, aGlobalHandler);
lControl.Click += aGlobalHandler;
}
}
然后在表单上调用它,加上要调用的函数名:
attachGlobalHandler( Form1, myClickHandler );
这应该将它绑定到表单上的每个可点击控件。处理程序的sender
参数应该总是指向触发事件的控件。话虽如此,我可能只是附加单独的事件处理程序,除非您需要将多个控件作为一个组来处理。
警告:上面的代码未经测试。
对于第二个问题"如何确定哪个控件被单击了",每个控件都有可以在代码中处理的事件。
知道控件何时被单击的最简单方法是将其附加到控件的已单击事件上,这是通过控件的属性完成的。您可能必须单击闪电图标才能查看事件。双击偶数旁边将创建一个空处理程序。
例如,如果您有一个简单的表单,带有单个按钮,将单击事件附加到表单和按钮上,该按钮将在任何地方发生单击时告诉您。在大多数情况下,按钮点击是最有用的处理方式。
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
private void Form1_Click(object sender, EventArgs e)
{
}
private void button1_Click(object sender, EventArgs e)
{
}
}
真的很简单!
在Win-Form的点击事件中,添加
// Here is a modified version of your code:
private void Form1_Click(object sender, EventArgs e)
{
var control = Form1.ActiveControl;
}