2010-09-02 105 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