0

我使用 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文本将在设计器中更改,这是屏幕截图: 在此处输入图像描述

但是当我重建测试程序或在运行时文本myGroupBox会消失,这里是截图:

在此处输入图像描述

我应该如何处理我的代码?谢谢

4

1 回答 1

1

所以问题是Namea Control(or 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.

希望有帮助。

于 2016-01-21T13:33:40.827 回答