如何在设计时设置UserControl的标签?

时间:2011-11-08 15:13:51

标签: c# winforms

这是设置:我创建了一个用户控件MyUserControl。在此控件上是一个简单的标签。当我在表单上删除此控件的新实例时,我希望标签是控件的名称。例如,如果这是控件的第一个实例,VStudio会自动将其名称设置为“myUserControl1”。我只想把标签读作“myUserControl1”。如果这是第五个控件,VStudio会将其命名为myUserControl5。我希望标签能够相应改变......但仅限于尚未设置的标签。一旦我将其设置为“标签”,就应该保持不变。

我觉得这很容易。在构造函数中,设置label1.Text = this.Name。但后来我意识到,在实例化时,这个名字只是MyUserControl。它还没有被VisualStudio和CONTAINING InitializeComponent()方法命名。

啊!我只是覆盖“名称”字段。设置完成后,检查DesignMode并更新标签!...但我无法覆盖名称。它不是虚拟的或抽象的。我可以使用“新”强制它,但是,它永远不会发射,从而打败了目的。

我可以用哪个事件来表示设计师何时命名控件?我知道当他们放弃对窗体的控制时,redmond人会一直这样做,所以这很有可能。我实际上对这个小谜语感到很难过。

3 个答案:

答案 0 :(得分:2)

覆盖调用OnLoad事件的Load方法怎么样?

如果这不起作用,它有点草率,但您可以使用TextChanged事件或SizeChanged事件,因为这些事件都是在Name属性设置后调用的由设计师(它按字母顺序设置值)。

答案 1 :(得分:1)

所以,这是最终答案:

根据汉斯的建议,它确实需要一个ControlDesigner。我创建了一个简单的设计器,它可以与一些内部属性进行交互,我确实让它工作了。不过这是一个问题:它有点像黑客。似乎没有一个字段具有我正在寻找的值,所以我必须对一个对象执行.ToString(),然后解析出第一部分。我认为它会像现在一样干净。

public class MyControlDesigner : ControlDesigner
{
    public MyControlDesigner()
    {
    }


    public override void InitializeNewComponent(IDictionary defaultValues)
    {
        base.InitializeNewComponent(defaultValues);

        MyControl control1 = this.Component as MyControl;
        control1.LabelText = control1.ToString().Split(" ".ToCharArray())[0];
    }
}

然后在MyControl的顶部,我只添加了一个新属性:

[DesignerAttribute(typeof(MyControlDesigner))]
public partial class MyControl : UserControl
{
    ...

    // Using the property "Text" Causes Visual Studio to crash!!!
    public string LabelText
    {
        get { return label1.Text; }
        set { label1.Text = value; }
    }

    ...
}

正如你所看到的,它并不是很复杂,但它有点像黑客攻击。当我试图覆盖“文本”时,控件锁定了IDE。不知道为什么,但当我称之为“LabelText”时,它运作得很好。

答案 2 :(得分:0)

编辑设计器文件。例如,假设我有一个名为Form1的表单。所以,我会在visual studio中拥有Form1.cs,Form1.resx和Form1.Designer.cs。如果打开Form1.Designer.cs,您将看到:

   #region Windows Form Designer generated code

        /// <summary>
        /// Required method for Designer support - do not modify
        /// the contents of this method with the code editor.
        /// </summary>

这是一个警告,但您仍然可以编辑此文件。

这是一个示例编辑,我将label3文本设置为label1的名称:

            // 
            // label3
            // 
            this.label3.AutoSize = true;
            this.label3.Location = new System.Drawing.Point(371, 146);
            this.label3.Name = "label3";
            this.label3.Size = new System.Drawing.Size(35, 13);
            this.label3.TabIndex = 10;
            this.label3.Text = "label3";
            //My Edit
            this.label3.Text = this.label1.Name;

现在,在Visual Studio中的表单设计器中,我看到label3具有label1的名称:

enter image description here

可以使用类似的方法进行用户控制。