C# 单击了哪个控件?

C# 单击了哪个控件?,c#,winforms,C#,Winforms,我的WinForm C应用程序上的MouseEvents有问题。我想让所有鼠标点击我的应用程序。 如何确定单击了哪个控件?(我是初学者C#)如果您正在使用Windows窗体,您有几个选项: ,然后确定单击的组件是否真的成为应用程序的一部分 您可以声明一个基类MyComponent:Control。该组件覆盖MousClick事件,并引发一个关于事实的通知。应用程序中的每个控件都源自该控件,因此每个控件都会通知在其上发生的单击。这就足够了 记录事件并按要求进行处理 只是一些想法 如果您使用的是Wi

我的WinForm C应用程序上的MouseEvents有问题。我想让所有鼠标点击我的应用程序。
如何确定单击了哪个控件?(我是初学者C#)

如果您正在使用Windows窗体,您有几个选项:

  • ,然后确定单击的组件是否真的成为应用程序的一部分

  • 您可以声明一个基类
    MyComponent:Control
    。该组件覆盖
    MousClick
    事件,并引发一个关于事实的通知。应用程序中的每个控件都源自该控件,因此每个控件都会通知在其上发生的单击。这就足够了 记录事件并按要求进行处理


  • 只是一些想法

    如果您使用的是Windows窗体,则有几个选项:

  • ,然后确定单击的组件是否真的成为应用程序的一部分

  • 您可以声明一个基类
    MyComponent:Control
    。该组件覆盖
    MousClick
    事件,并引发一个关于事实的通知。应用程序中的每个控件都源自该控件,因此每个控件都会通知在其上发生的单击。这就足够了 记录事件并按要求进行处理


  • 只是一些想法

    您必须将它们连接到同一个事件处理程序。这可以在相关控件的“属性”窗口中完成。您还可以编写自己的函数来遍历控制树,并将函数绑定到它们的每个事件处理程序

    可以使用foreach循环递归遍历Form.Controls集合

    void attachGlobalHandler(Control aToParse, EventHandler aGlobalHandler)
    {
        foreach(Control lControl in aToParse.Controls)
        {
            attachGlobalHandler(lControl, aGlobalHandler);
            lControl.Click += aGlobalHandler;
        }
    }
    
    然后在表单上调用它,并使用要调用的函数名:

    attachGlobalHandler( Form1, myClickHandler );
    
    这应该将它绑定到表单上的每个可单击控件。然后,处理程序的
    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));
        }
    
    可以使用foreach循环递归遍历Form.Controls集合

    void attachGlobalHandler(Control aToParse, EventHandler aGlobalHandler)
    {
        foreach(Control lControl in aToParse.Controls)
        {
            attachGlobalHandler(lControl, aGlobalHandler);
            lControl.Click += aGlobalHandler;
        }
    }
    
    然后在表单上调用它,并使用要调用的函数名:

    attachGlobalHandler( Form1, myClickHandler );
    
    这应该将它绑定到表单上的每个可单击控件。然后,处理程序的
    sender
    参数应始终引用触发事件的控件。话虽如此,我可能只附加单个事件处理程序,除非您需要将多个控件作为一个组来处理

    警告:上面的代码未经测试。

    private void Form1\u Load(对象发送方,事件参数e)
    
        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));
        }
    
    { SetupClickEvents(此); } /// ///这将遍历容器中的每个控件,并向其添加一个单击处理程序 /// ///要为其子容器处理单击的容器 私有void设置ClickEvents(控制容器) { foreach(container.Controls中的控件) { 控件。单击+=手柄单击; } } 私有void handleclick(对象发送方,事件参数e) { 控制=(控制)发送方; Show(string.Format(“{0}已单击!”,control.Name)); }
    私有作废表单1\u加载(对象发送方,事件参数e)
    {
    SetupClickEvents(此);
    }
    /// 
    ///这将遍历容器中的每个控件,并向其添加一个单击处理程序
    /// 
    ///要为其子容器处理单击的容器
    私有void设置ClickEvents(控制容器)
    {
    foreach(container.Controls中的控件)
    {
    控件。单击+=手柄单击;
    }
    }
    私有void handleclick(对象发送方,事件参数e)
    {
    控制=(控制)发送方;
    Show(string.Format(“{0}已单击!”,control.Name));
    }
    
    对于第二个问题“如何确定单击了哪个控件?”每个控件都有可以用代码处理的事件

    了解控件何时被单击的最简单方法是附加到控件的单击事件,该事件是通过控件的属性完成的。您可能必须单击闪电图标才能查看事件。双击偶数旁边的将创建一个空处理程序

    例如,如果您有一个简单的表单,其中有一个按钮将单击事件附加到表单和按钮,则该按钮将告诉您何时有单击。在大多数情况下,按钮点击是最有用的处理方式

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Click(object sender, EventArgs e)
        {
    
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
    
        }
    }
    

    对于第二个问题“如何确定单击了哪个控件?”每个控件都有可以用代码处理的事件

    了解控件何时被单击的最简单方法是附加到控件的单击事件,该事件是通过控件的属性完成的。您可能必须单击闪电图标才能查看事件。双击偶数旁边的将创建一个空处理程序

    例如,如果您有一个简单的表单,其中有一个按钮将单击事件附加到表单和按钮,则该按钮将告诉您何时有单击。在大多数情况下,按钮点击是最有用的处理方式

    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
    
        private void Form1_Click(object sender, EventArgs e)
        {
    
        }
    
        private void button1_Click(object sender, EventArgs e)
        {
    
        }
    }
    
    试试这个:

    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 Control_Clicks(object sender, EventArgs e)
    {
        Control control = (Control)sender;   // Sender gives you which control is clicked.
        MessageBox.Show(control.Name.ToString());
    }
    
    ,或可能有帮助

    希望有帮助。

    这真的很简单

    在Win表单中的单击事件中,您添加

    // Here is a modified version of your code:
    private void Form1_Click(object sender, EventArgs e)
    {
        var control = Form1.ActiveControl;
    }
    
    真的很简单

    在Win表单中的单击事件中,您添加

    // Here is a modified version of your code:
    private void Form1_Click(object sender, EventArgs e)
    {
        var control = Form1.ActiveControl;
    }
    

    你试过什么?这取决于事件的关联方式。事件处理程序的
    sender
    参数将告诉您发送事件的对象(控件)