Winforms控件占位符

时间:2011-01-29 02:12:59

标签: .net winforms controls

我正在尝试将System.Windows.Forms.Control添加到给定的表单控件集合中。我这样做是通过创建类型控件的私有字段,然后将此字段实例化为构造函数中的System.Windows.Forms.Control的新实例。

在运行时,我试图通过执行类似以下代码示例的操作,将_placeholder变量的类型更改为TextBox。所以基本上我试图拥有一个Control类型的占位符,并在运行时将其更改为另一个控件,如TextBox或Label。我的问题是我的表单上没有显示任何内容?任何见解将不胜感激。

public class MyForm : Form
{
  System.Windows.Forms.Control _placeholder = null;

  public MyForm()
  {
    _placeholder = new System.Windows.Forms.Control();
    this.Controls.Add(_placeholder);

    ChangeToTextBox();
  }

  public void ChangeToTextBox()
  {
    _placeholder = new TextBox();
  }
}

2 个答案:

答案 0 :(得分:5)

这不会起作用,因为原始占位符仍然是添加到控件的引用。您可以通过执行以下操作来解决此问题:

public void ChangeToTextBox()
{
  this.Controls.Remove(_placeholder); // Remove old
  _placeholder = new TextBox();
  this.Controls.Add(_placeholder); // Add new
}

话虽如此,如果要进入表单上的相同位置,您可能需要考虑在其中放置Panel,并将TextBox添加到Panel中。这样就不需要删除现有的控件了,因为它只是添加一个。

答案 1 :(得分:1)

它不起作用,因为添加到Controls集合的内容是您在构造函数中添加的System.Windows.Forms.Control实例。然后,您将_placeholder指向的对象更改为文本框控件,但您永远不会将该文本框添加到表单的Controls集合中。