【发布时间】:2011-11-08 15:13:50
【问题描述】:
设置如下:我创建了一个用户控件 MyUserControl。在这个控件上有一个简单的标签。当我在窗体上放置此控件的新实例时,我希望标签是控件的名称。例如,如果这是控件的第一个实例,VStudio 会自动将其名称设置为“myUserControl1”。我只想将标签读取为“myUserControl1”。如果这是第五个控件,VStudio 会将其命名为 myUserControl5。我希望标签相应地改变......但前提是它尚未设置。一旦我将它设置为“标签”,它就应该被单独放置。
我认为这很容易。在构造函数中,设置 label1.Text = this.Name。但后来我意识到,在实例化时 this.Name 只是 MyUserControl。它还没有被 VisualStudio 和 CONTAINING InitializeComponent() 方法命名。
啊!我将覆盖“名称”字段。设置好后,检查 DesignMode 并更新标签!...但我无法覆盖名称。它不是虚拟的或抽象的。我可以使用“new”来强制它,但是它永远不会触发,从而破坏了目的。
当设计者为控件命名时,我可以使用哪个事件来表示?我知道当他们在表单上放置控件时,redmond 的人总是这样做,所以这是很有可能的。我其实被这个小谜语难住了。
【问题讨论】:
-
有趣的挑战。在您删除或剪切/粘贴任何用户控件之前,我只提出了几种可以正常工作的方法。 Name 属性似乎在设计时实际上并没有改变。现在必须做一些真正的工作......祝你好运!
-
这需要自定义设计器。 ControlDesigner.InitializeNewComponent() 就是一个很好的例子。问题是,UserControl 的设计器不是公开的,因此无法派生。