如何以编程方式将自定义控件添加到窗体并显示它?

How to programmatically add a Custom Control to a Form and show it?

我正在尝试以编程方式使用另一个 class 向 Windows 表单添加标签。我的标签没有出现在表单中。
我不知道我哪里错了。

private void Form1_Load(object sender, EventArgs e)
{
     Ticker ticker = new Ticker("ASDF");
     ticker.display();
}

public class Ticker : Label
{
     string labelText;
     Label label = new Label();

     public Ticker(string _labelText)
     {
         labelText = _labelText;
     }
     public void display()
     {
         label.Text = labelText;

         Controls.Add(label);
     }
}

您可以对 Ticker 自定义控件进行一些更改:

  • 您不需要在自定义控件中创建新标签:您的控件已经是标签,使用this 参考以设置其属性(另请参阅 this keyword (C# Reference))。
  • 文本是当前标签的文本 (this.Text)。如果您出于其他原因需要它的副本(通常是自定义绘画,所以有时您需要清除文本),请保存它。
    Controls 指的是当前的 class 对象:它是一个控件,所以它有一个 Controls 属性,它获取 ControlCollection 一个控件的子控件。
  • 您还需要指定一个点来定义自定义控件在其 Parent's ClientRectangle 中的位置。
  • 即使并非总是需要,也可以向您的自定义控件添加一个无参数构造函数:if/when它确实需要,您已经拥有它了。

如果您不想像往常一样从外部设置父控件(例如,var label = new Label(); this.Controls.Add(label);),您需要传递将成为自定义标签的父控件的控件。
您可以使用此引用 - Control 类型的引用 - 并将您的 Label 添加到您收到的 Control 引用的 Controls 集合中:

// You want to store a reference to this Control if you need it later...
private Ticker ticker = null;

private void Form1_Load(object sender, EventArgs e)
{
    //... or just declare it with: var ticker = new Ticker() if you don't
    ticker = new Ticker("The Label's Text");
    // [this] of course refers the current class object, Form1
    ticker.Display(this, new Point(100, 100));
    // Or, display the Label inside a Panel, child of Form1
    // Note: if you don't comment the next line, the Label will be moved to panel1
    ticker.Display(this.panel1, new Point(10, 50));
}

在这里,我重载了 Display() 方法,因此它接受父引用和 Point 值,用于将控件定位在其父客户区内。
自定义标签自身也会调用 BringToFront(),以避免出现在 一些其他已经存在的新 Parent.

的子控件下
public class Ticker : Label
{
    public Ticker() : this("ticker") { }
    public Ticker(string labelText) => this.Text = labelText;

    public void Display(Control parent) => Display(parent, Point.Empty);
    public void Display(Control parent, Point position)
    {
        this.Location = position;
        parent.Controls.Add(this);
        this.BringToFront();
    }
}