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
,
Надеюсь, это поможет.