C# 公开UserControl的所有事件处理程序

C# 公开UserControl的所有事件处理程序,c#,winforms,user-controls,event-handling,eventhandler,C#,Winforms,User Controls,Event Handling,Eventhandler,我的WinForm用户控件中有一堆文本框。这些文本框中的每一个都有一些事件处理程序,例如在输入上-显示带有建议的列表框,在输入上-如果键为键,则显示键为键。代码==键。输入下一个控件()。当我将该控件放置在表单中时,这些事件都不会触发。如何将所有这些事件公开给包含表单?如何使UserControl的事件启动该UserControl的事件处理程序?因此,如果我理解正确,我认为有两种方法可以继续: 方法1 在UserControl中,将每个文本框(或您感兴趣的文本框)的Modifiers属性设置为p

我的WinForm用户控件中有一堆文本框。这些文本框中的每一个都有一些事件处理程序,例如在输入上-显示带有建议的列表框,在输入上-如果键为键,则显示键为键。代码==键。输入下一个控件()。当我将该控件放置在表单中时,这些事件都不会触发。如何将所有这些事件公开给包含表单?如何使UserControl的事件启动该UserControl的事件处理程序?

因此,如果我理解正确,我认为有两种方法可以继续:

方法1

在UserControl中,将每个文本框(或您感兴趣的文本框)的Modifiers属性设置为public:

然后,在使用此UserControl的表单中,您可以访问所有这些文本框及其事件:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        myUserControl1.textBox1.KeyDown += new KeyEventHandler(textBox1_KeyDown);
    }
}
方法2 (摘自)

您可以为UserControl创建新事件,只需转发底层文本框的事件。然后,底层文本框可以对UserControl保持私有

在UserControl中添加此事件:

public event KeyEventHandler TextBox1KeyDown
{
    add { textBox1.KeyDown += value; }
    remove { textBox1.KeyDown -= value; }
}
或者,您可以创建一个处理所有文本框的事件:

public event KeyEventHandler AnyTextBoxKeyDown
{
    add
    {
        textBox1.KeyDown += value;
        textBox2.KeyDown += value;
        textBox3.KeyDown += value;
        ...
    }
    remove
    {
        textBox1.KeyDown -= value;
        textBox2.KeyDown -= value;
        textBox3.KeyDown -= value;
        ...
    }
}
现在您的UserControl有了自己的事件,表单中的代码可以使用:

public partial class Form1 : Form
{
    public Form1()
    {
        InitializeComponent();

        myUserControl1.TextBox1KeyDown += new KeyEventHandler(myUserControl1_TextBox1KeyDown);
        myUserControl1.AnyTextBoxKeyDown += new KeyEventHandler(myUserControl1_AnyTextBoxKeyDown );
    }

    private void myUserControl1_TextBox1KeyDown(object sender, KeyEventArgs e)
    {
        /* We already know that TextBox1 was pressed but if
         * we want access to it then we can use the sender
         * object: */
        TextBox textBox1 = (TextBox)sender;

        /* Add code here for handling when a key is pressed
         * in TextBox1 (inside the user control). */
    }

    private void myUserControl1_AnyTextBoxKeyDown(object sender, KeyEventArgs e)
    {
        /* This event handler may be triggered by different
         * textboxes. To get the actual textbox that caused
         * this event use the following: */
        TextBox textBox = (TextBox)sender;

        /* Add code here for handling when a key is pressed
         * in the user control. */
    }
}

请注意,虽然这种方法在UserControl中保持文本框的私有性,但仍然可以通过
发送方
参数从事件处理程序访问它们。

任何可能的代码helpfull@valter-这是一个抽象的问题,代码是不相关的。我想你至今没有得到任何答案的原因是因为大多数在这里回答的人都希望在他们回答之前能找到一个解决方案。就我个人而言,如果我对你的理解是正确的,我认为你的问题不是真正抽象的,而是一个普遍的实际问题。如果您发布一些代码来显示您的尝试,那就太好了。无论如何,我会尽力为你回答这个问题。谢谢你的回答。不过,我还有两个问题。myUserControl1\u AnyTextBoxKeyDown是什么类型?应该在哪里声明?我假设它是一个“委托”,但不确定该定义应该放在哪里。@ArtK,
myUserControl1\u AnyTextBoxKeyDown
是一个用于处理事件的方法。如果您使用的是Visual Studio,则在为用户控件创建新事件(在本例中为
AnyTextBoxKeyDown
事件)后,该事件应显示在初始事件中,当您键入“+=new”时,它应提供为您填充其余事件的功能。如果让它填充其余部分,那么它也会自动创建新方法。这应该放在具有用户控件的form类中。在我的示例中,我将事件注册放在form构造函数中,这通常是最好的位置,但有时您可能希望根据需要将其放在其他位置。@ArtK我已更新了答案以显示事件方法。我希望这有帮助。