2010-09-02 127 views
3

我想在Windows窗体窗体上的运行时移除和添加控件。问题是,控件必须与另一个具有完全相同的大小,位置和锚点。动态移除/添加Windows窗体窗体上的控件

如果用户打开窗口并满足某个标准,我想删除旧的控件并将其替换为另一个控件。

所以,我尝试这样做:

RichTextBox InsideText = new RichTextBox(); 
InsideText.Location = InsideBox.Location; 
InsideText.Size = InsideBox.Size; 

Controls.Remove(InsideBox); 
Controls.Add(InsideText); 

但是,正如预期的,它没有工作。 InsideBox未被删除,InsideText未被添加。

我在做什么错?有没有更好的方法呢?

+1

您是否检查过InsideText的Visible属性是否为真? – Jonathan 2010-09-02 14:51:02

+1

这基本上是我如何做到这一点,它适用于我。从父控件的集合中删除控件时,它将消失。你确定要从正确的集合中删除它吗? – 2010-09-02 14:59:01

+0

我不认为我曾经有动态创建/删除控件的问题。你确定可见是真的吗?你是否尝试过设置X和Y,宽度和高度,而不是使用大小和位置(我总是使用X,Y,宽度,高度,我认为的旧习惯),这是我能够想到的唯一区别和这个例子。如果还有其他我们可以看到的相关代码,可能会有所帮助。 – FrustratedWithFormsDesigner 2010-09-02 15:32:43

回答

4

我建议更简单的方法将是:

  1. 在正确的位置添加一个面板用正确的锚等设置。
  2. 将该面板集内的控制1设置为全部Dock
  3. 只需删除control1并在该面板内添加control2,并将其设置为Dock即可。

然后所有大小的东西,等由一个面板完成,而不必复制周围。

0

注意:我之所以建议替代方法,而不是直接解决原始问题,是因为我没有看到OP发布的代码有什么问题。

另一种方法是在窗体设计器中在完全相同的位置创建两个控件,并且只有在满足条件时才切换其可见性。

正如评论中指出的那样,这种方法确实存在一个缺点,即在设计者中处理表单会变得更加困难。

如果事实证明这是一个问题,您仍然可以将设计器用于另一端:使用上述方法仅用于查看创建“新”控件所需的代码;然后从InitializeComponent中删除该代码并将其移至旧“控制”应由新的代码替换的位置。这样,您可以确定创建新控件的代码是正确的。

+0

当你想在表单设计器中尝试和编辑东西时,这使得它有点噩梦。 – FrustratedWithFormsDesigner 2010-09-02 14:53:15

+0

(我不是downvoter)在这种情况下,这*可能*适用于OP,但它没有解决一般情况下想要用一个新控件的实例任意替换一个控件的情况。 – 2010-09-02 14:55:34

+0

_ @ FrustratedWithFormsDesigner:_我已经通过编辑处理了你的批评。如果你是downvoter,我可以请你重新考虑你的投票吗?我很满意,这是合理的,我只希望它不仅仅是因为我的回答包括“表单设计器”这个词,你似乎不喜欢...... :) – stakx 2010-09-02 15:09:45