将相同事件应用于C#中的每个项目按钮

时间:2018-09-20 17:17:29

标签: c# winforms

我有一个包含3个表单和10个用户控件的项目。这些组件每个都有大约10个按钮。 当用户将鼠标悬停时,我想使用一个事件来应用样式。有没有一种方法可以为通用组件创建此事件,然后将其自动应用于每个组件? 因为我不一定要手动处理130个按钮事件^^

2 个答案:

答案 0 :(得分:4)

您可以使用递归方法,并在表单上调用它。它将遍历您窗体的所有子控件以及它们的子控件,如果它们是一个按钮,它将把它们链接到您的集中式方法。

这是一个带有Click事件的示例,但是它可以应用于任何事件:

    private void RecursiveClickSubscribe(Control c)
    {
        if (c is Button)
        {
            c.Click += GenericClickHandler;
        }
        foreach (Control child in c.Controls)
        {
            RecursiveClickSubscribe(child);
        }

    }

    private void GenericClickHandler(object sender, EventArgs e)
    {
        // stuff you want to do on every click
    }

    Form myForm; // one of your three forms.
    RecursiveClickSubscribe(MyForm);

答案 1 :(得分:2)

您最好的选择可能是子类化button类,并在其余的代码中使用它。在所有表单和用户定义的控件中进行反射以标识每个按钮并向每个按钮添加事件处理程序将非常昂贵(无论是在开发人员时间还是在运行时间方面)。由于Button class未被密封,因此您可以轻松地重写OnMouseHover()方法以根据需要更新按钮(确保在退出覆盖之前调用基类方法)。