我使用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
的文本将是名称我打字了。所以我在属性窗口中输入了Value
到myGroupBox
的名称,文本将在设计器中更改,这是截图:
但是当我重建测试程序或在运行时myGroupBox
的文本将消失时,屏幕截图如下:
我的代码怎么办?感谢
答案 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
。
希望有所帮助。