【问题标题】:Expose all event handlers of UserControl公开 UserControl 的所有事件处理程序
【发布时间】:2017-08-24 05:11:34
【问题描述】:

我的 WinForm 用户控件中有一堆文本框。每个文本框都有一些事件处理程序,例如 On_Enter - 显示带有建议的 ListBox,On_KeyUP - if Keys.Code == Keys.Enter - SelectNextControl()。当我将该控件放在表单中时,这些事件都不会触发。如何将所有这些事件暴露给包含表单?如何使 UserControl 的事件触发该 UserControl 的事件处理程序?

【问题讨论】:

  • 任何有用的代码
  • @valter - 这是一个抽象问题,代码无关紧要
  • 我认为到目前为止您的问题没有得到任何答复的原因是因为大多数在这里回答的人都希望看到在他们回答之前尝试找到解决方案。就个人而言,如果我理解你的话,我认为你的问题并不是很抽象,而是一个普遍的实际问题。如果您发布一些代码来显示您尝试过的内容,那就太好了。无论如何,我会尽力为您解答。

标签: c# winforms user-controls event-handling eventhandler


【解决方案1】:

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

方法 1

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

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

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

        myUserControl1.textBox1.KeyDown += new KeyEventHandler(textBox1_KeyDown);
    }
}

方法 2 (取自this post

您可以为您的 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 中保持文本框私有,但仍可以通过 sender 参数从事件处理程序访问它们。

【讨论】:

  • 非常感谢您的回答。但是,我还有 2 个问题。 myUserControl1_AnyTextBoxKeyDown 是什么类型,应该在哪里声明?我假设它是一个“代表”,但不太确定该定义应该放在哪里。
  • @ArtK, myUserControl1_AnyTextBoxKeyDown 是一种用于处理事件的方法。如果您使用的是 Visual Studio,那么在为您的用户控件创建新事件(在此示例中为 AnyTextBoxKeyDown 事件)后,它应该出现在 intielisence 中,并且当您键入“ += new ”时,它应该提供填写为你休息。如果您让它填充其余部分,那么它也会自动创建新方法。这应该放在具有用户控件的表单类中。
  • 在我的示例中,我将事件注册放在 Form 构造函数中,这通常是最好的地方,但有时您可能希望根据要求将其放在其他地方。
  • @ArtK 我已经更新了我的答案以显示事件方法。我希望这会有所帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-09
  • 2017-12-16
  • 1970-01-01
  • 2016-11-07
  • 2016-09-06
相关资源
最近更新 更多