2013-01-22 38 views
2

我的應用程序需要能夠動態創建新的表單元素並使用它們。現在我有一個面板上有按鈕和標籤。我需要能夠複製這個並在我的應用程序中顯示它,然後使用它。C#表單元素的動態命名

例如,我有panel1。裏面是label1,button1和button2。 標籤1只是秒數。 當您單擊button1時,label1開始向上計數。當您單擊按鈕2時,計時器停止。 我的問題是,我需要能夠重複多次panel1,並仍然有新的按鈕對應於正確的標籤。

button_click

private void button1_Click(object sender, EventArgs e) 
{ 
    Button theSender = (Button)sender; 
    Panel parentPanel = (Panel)theSender.Parent; 
} 

從這裏,我不能針對任何子控件的。我習慣於在jQuery中進行定位和處理,所以我甚至不知道如何解釋我自己的正確的C#術語。

回答

3

如果你正確地理解你的問題,我建議你做一個UsercontrolPanel並填寫你的Label,Button和任何。在用戶控件中編寫按鈕的事件。然後在你的表單中引入這個用戶控件,它應該可以工作。您可以在表單中引入任意數量的用戶控件,並且每個按鈕僅對該用戶控件中的標籤執行/工作。

正如你所提到的你是winforms中的新手,你不確定我在說什麼,請告訴我,如果我有足夠的時間,我會幫忙。

希望它有幫助。

+0

我喜歡這個想法。我需要做更多的研究並嘗試實施它。我會讓你知道它是怎麼回事。現在,我用Button btn = this.Controls [「button1」];方法來定位我的孩子的控件。我可能會在稍後再做。我希望UserControls很容易理解。 – Chris

+0

Usercontrol很容易學習....我建議你使用usercontrol而不是你的方法。但是,如果你可以......等一個小時,我會發布另一個你可以很容易理解的答案,也可以在不引入任何新概念的情況下爲你的目的服務。我現在休息一下。需要雞塊麥金塊:P – Sandy

+0

這對我很有用。我昨天剛剛開始C#,所以我知道我正在處理一個第一個項目的野獸。我只是試圖建立我的簡歷並添加一種新的語言和技能。無論如何,我現在都會閱讀。 – Chris

1

可以使用Control.Contrtols集合訪問控件的子項,例如,訪問按鈕形式:

Button btn = this.Controls["button1"]; 

但如果Button1的直接置於窗體和button1.Name屬性設置爲「Button1的」這是唯一真正的(設計師確實是automattically,如果你正在創建你的控件動態地,你必須照顧自己命名你的控件。)

你也可以枚舉任何控件的子控件,例如兒童控制面板1:

foreach(Control c in panel1.Controls) 
{ 
// do something, e.g. 
    if(c is Label){//do sth...} 
    if(c.Name.Equals("label1") && c is Label) 
    { 
     Label l = c as Label; 
    } 
} 

和@rapsalands說,UserControl可能是你的答案。

+0

太多麻煩,UserControls是封裝的功能,並能夠反覆複製它的最佳方式 – Adi

+0

我同意,通常UserControls更好 – Arie

+0

我結束了使用UserControls ,但我正在使用你的第一行代碼來定位控件。這是昨天幾個小時的頭痛。感謝那條線。 – Chris

0

您可以在代碼中創建新的UI控件,你會任何其他對象:Button b = new Button();

然後你可以將它們添加到使用form.Controls.Add(b)形式。您還需要定位和調整控件的大小(有可用的屬性),並使用b.Clicked += form.button_click;掛接事件處理程序。

要查看此示例,可以嘗試查看Visual Studio中生成的designer.cs文件(不要對其進行更改,只需查看一下)即可。它起初看起來相當複雜,但可能會以某種方式幫助揭開Windows窗體的神祕面紗,並且您將能夠找到您需要在其中設置的所有屬性。

每當您更新設計器中的某些內容時,Visual Studio會生成新代碼並將其放入designer.cs文件中。整個表單在InitializeComponent()方法中設置,該方法從表單的構造函數中調用。您應該能夠複製一些代碼並進行一些修改,將其用於創建您自己的動態UI元素。

正如rapsalands所說,聽起來好像用戶控件在這種情況下會很有用,因爲它有助於封裝您之後的功能。然而,這可能需要一些時間才能讓你頭腦清醒,並且現在可以更簡單地完成表單中的所有操作,而無需創建新的控件。

+0

我不清楚你的答案.....我需要根據某些計算基礎確定運行時面板的數量。那麼你怎麼用'.designer'寫一些東西。如果我想要100個面板,那麼我應該在設計師手動製作100個面板?如果我決定使用'flowlayoutpanel'而不是'Panel',那麼我應該再次編輯相同數量的代碼嗎? – Sandy

+0

我並不是建議對.designer代碼進行更改,只是爲了看看如何實例化代碼中的控件。我會編輯我的答案,使其更清晰。 – rankAmateur

0

所以你是一個初學者,需要一些時間來理解Usercontrol,正如我在我以前的答案中提到的。在窗體的ConstructorLoad事件中使用for循環來動態生成控件。

Panel panel; 
Label label; 
Button button1; 
Button button2; 

for(int i = 0; i > count; i++) 
{ 
    panel = new Panel(); 
    button1 = new Button(); 
    button2 = new Button(); 
    label = new Label(); 

    panel.Controls.Add(button1); 
    panel.Controls.Add(button2); 
    panel.Controls.Add(label); 
    Controls.Add(panel); 

    button1.Click += Event1; 
    button2.Click += Event2; 
} 

private void Event1() 
{ 
    label.Text = "Button 1 Clicked." 
} 
private void Event2() 
{ 
    label.Text = "Button 2 Clicked." 
} 

這種方式當然可以創建儘可能多的控件,也將爲您的目的。使用一些變量適當地定位面板控件。在控制的for循環中設置你希望添加的屬性。

這只是我以前答案的替代方案。我仍然建議我先前給出的答案。此代碼是虛擬的,未經測試。

希望它有幫助。

+0

我想這個代碼在某種程度上仍然可以擴展 – Sandy