C# Composite Control потеряет имя при разработке и во время выполнения

Я разработал составной элемент управления с использованием библиотеки элементов управления C# Windows Forms и кода следующим образом:

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 Forms, и я хотел бы видеть это, когда я изменяю имя myGroupBox в окне свойств, текст myGroupBox будет имя, которое я напечатал. поэтому я набрал имя Value в myGroupBox в окне свойств текст изменится в конструкторе, вот скриншот: введите описание изображения здесь

Но когда я перестраиваю тестовую программу или во время выполнения текст myGroupBox исчезнет, ​​вот скриншот:

введите описание изображения здесь

что мне делать с моим кодом? Спасибо

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,

Надеюсь, это поможет.

Другие вопросы по тегам