2012-05-03 41 views
2

我有兩種形式。單擊form1上的按鈕將打開form2,用戶添加詳細信息並將其返回到form1,信息將存儲到List,並創建TextBox和其他界面元素。在獲獎表單上動態添加元素?

我有5個標籤爲不同的水平,但添加的信息是相同的。

我怎樣才能避免產生類似的代碼,5次使用元素的

if (level==5) {//do this whole code again} 

舉例說:

int _nextTextBoxTop=15; 
List<TextBox> CodesMy = new List<TextBox>(); 

var code = new TextBox(); 
CodesMy.Add(code); 
code.Location = new Point(12, _nextTextBoxTop); 
_nextTextBoxTop += 36; 
code.Size = new Size(80, 25); 
code.Text = mcode; 
tabPageLevel5.Controls.Add.Controls.Add(code); 

回答

2

最簡單的解決方案可能是你的元素創建重構爲這樣一個單獨的函數:

CreateControls(TabPage tabPage) 
{ 
var code = new TextBox(); 
CodesMy.Add(code); 
code.Location = new Point(12, _nextTextBoxTop); 
_nextTextBoxTop += 36; 
code.Size = new Size(80, 25); 
code.Text = mcode; 
tabPage.Controls.Add.Controls.Add(code);  
} 

您的客戶端代碼將如下所示:

if (level==5) {CreateControls(tabPageLevel5);} 

比動態添加控件更簡單的方法是創建一個用戶控件,用於您的每個標籤頁上。

即使您需要動態添加控件,您仍然可以通過用戶控件執行此操作,並在每個附加的標籤頁上每次都克隆它。

+0

這很好,我只是想盡量避免克隆這個或它不可能 – GuyWhoReadsStockoverflow

+0

看到我的更新。只需重構一個單獨的方法。 –

+0

好吧,那很好。我還有一個額外的問題,儘管控件是相同的添加元素的列表是不同的,因爲我需要訪問特定元素來進行計算。所以我有: List CodesMy = new List (); 列表 CodesMy2 =新名單(); ...... – GuyWhoReadsStockoverflow

1

你不應該絕對地指定位置。創建一個FlowLayoutPanel,並將每個新的文本框(或帶有代表要添加的新「東西」的所有控件的用戶控件)添加到該面板,以便將它們添加到剛纔的面板下面。

您將它們添加到的FlowLayoutPanel可能因您要將其添加到哪個標籤而有所不同。你可以把它作爲一個方法的參數,類似於Paul的建議,或者你可以有一個變量currentTab,panelInCurrentTab或類似的設置,然後一個方法,只是將新的控件添加到該容器。

+0

他們不是絕對的,他們是GroupBox的一部分,但我沒有複製相同的代碼。編輯代碼 – GuyWhoReadsStockoverflow