暴露底层控件的事件

问题描述 投票:0回答:4

我在自定义控件中有一个

ComboBox
。如何向实现我的自定义控件的任何人/事物公开其中的特定事件,例如
SelectedIndexChanged
KeyPress
等?

c# winforms user-controls
4个回答
93
投票

您可以像这样转发事件:

    public event EventHandler SelectedIndexChanged 
    {
        add { inner.SelectedIndexChanged += value; }
        remove { inner.SelectedIndexChanged -= value; }
    }

3
投票

您需要自己将这些代码编码到控件中 - 用户控件不会自动提升其子控件的事件。然后,您可以将实际控件交叉连接到用户控件的提升事件:

public event EventHandler SelectedIndexChanged;

private void OnSelectedIndexChanged(object sender, EventArgs e)
{
    if (SelectedIndexChanged != null)
        SelectedIndexChanged(sender, e);
}

public UserControl1()
{
    InitializeComponent();
    cb.SelectedIndexChanged += new EventHandler(OnSelectedIndexChanged);
}

不幸的是,您需要对您感兴趣的每个活动执行此操作。


2
投票

一个非常简单的解决方案,而不是使用自定义事件,是将嵌套控件公开为自定义控件的属性。从那里您可以非常轻松地将事件处理程序附加到它。公开子控件并不总是可取的,但根据控件类型以及您使用它的方式,它可能会起作用。

//create an instance of my control
MyCustomControl controlInstance = new MyCustomControl();

//attach and event handler to the exposed subcontrol
controlInstance.SaveButton.Click += new EventHandler(SaveButton_Click);

1
投票

设计师还有另一种方法来处理这个问题:

在设计器上,在自定义控件中,在“设计”下的组合框属性上,将“修饰符”设置为内部。

然后在你需要做一些事情的地方添加:

CustControlName.YourCombo.SelectedIndexChanged += YourCombo_SelectedIndexChanged;

连同:

private void YourCombo_SelectedIndexChanged(object sender, EventArgs e)
{ 
    // Code to execute when the SelectedIndexIsChanged goes here
}
© www.soinside.com 2019 - 2024. All rights reserved.