C#Composite Control将在设计和运行时丢失名称

时间:2016-01-21 13:23:01

标签: c# winforms composite-controls

我使用C#Windows窗体控件库和代码开发了一个复合控件,如下所示:

public partial class MyControl : UserControl
{
    public event EventHandler NameChanged;
    protected virtual void OnNameChanged()
    {
        EventHandler handler = NameChanged;
        if (handler != null) handler(this, EventArgs.Empty);
    }

    private void WhenNameChanged(object sender , EventArgs e)
    {
        this.myGroupBox.Text = this.Name;
    }

    protected override void OnCreateControl()
    {
        base.OnCreateControl();

        IComponentChangeService changeService = (IComponentChangeService)GetService(typeof(IComponentChangeService));
        if (changeService == null) return; // not provided at runtime, only design mode

        changeService.ComponentChanged -= OnComponentChanged; // to avoid multiple subscriptions
        changeService.ComponentChanged += OnComponentChanged;
    }

    private void OnComponentChanged(object sender, ComponentChangedEventArgs e)
    {
        if(e.Component == this && e.Member.Name == "Name")
        {
            OnNameChanged();
        }
    }

    public MyControl()
    {
        InitializeComponent();
        this.NameChanged += new EventHandler(this.WhenNameChanged);
    }
}

MyControl只有一个名为GroupBox

myGroupBox控件
private System.Windows.Forms.GroupBox myGroupBox;

我有一个C#Windows窗体应用程序的测试程序,我想看到当我在属性窗口中更改myGroupBox的名称时,myGroupBox的文本将是名称我打字了。所以我在属性窗口中输入了ValuemyGroupBox的名称,文本将在设计器中更改,这是截图: enter image description here

但是当我重建测试程序或在运行时myGroupBox的文本将消失时,屏幕截图如下:

enter image description here

我的代码怎么办?感谢

1 个答案:

答案 0 :(得分:1)

问题是,Name(或Control)的UserControl在构建后为空。您提供并存储在资源中的名称将在OnLoad中设置 因此,您可以使用以下内容覆盖OnLoad

public class MyControl : UserControl
{
    // ... the code so far

    // override OnLoad
    protected override void OnLoad(EventArgs e)
    {
        base.OnLoad(e);
        myGroupBox.Text = Name; // or WhenNameChanged(this, EventArgs.Empty);
    }
}

因此,从资源中获取的名称(例如,在重建/重新打开设计器之后)将再次设置在此处,因此也设置为myGroupBox.Text

希望有所帮助。