如何以编程方式将自定义控件添加到窗体并显示它?
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();
}
}
我正在尝试以编程方式使用另一个 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();
}
}