2011-02-17 27 views
1

我希望能夠將多個標籤控件添加到面板並在onlick事件中顯示它們。我的代碼第一次做了我想要的,然後標籤簡單地用第二個onlick事件上的新標籤替換,等等。在webforms中添加多個控件到面板

這是我到目前爲止有:

private void createTaskLabel(Guid GoalID, string Goal) 
{ 
    Label taskLabel = new Label(); 
    taskLabel.ID = GoalID.ToString(); 
    taskLabel.Text = Goal.ToString(); 
    TaskPanel.Controls.Add(taskLabel); 
} 

所以,舉例來說,這將創建一個新的標籤具有唯一ID(在其他地方處理),並將其放置在面板中,並顯示它。當onlick再次發射時,相同的標籤將被替換,而不是出現在其下面的新標籤。

回答

5

動態創建的控件在回發後不會持久。您需要跟蹤您生成的控件數量,並且每次都重新生成所有這些控件,以實現您的目標。基本實現:

List<string> LabeIDList = new List<string>(); 

override SaveViewState(..) 
{ 
    if (LabelIDList.Count>0) { 
     ViewState["LabelDIList"]=LabelIDList; 
    } 
    base.SaveViewState(..) 
} 
override LoadViewState() 
{ 
    base.LoadViewState(); 
    if (ViewState["LabelIDList"]!=null) { 
     LabelIDList = (List<string>)ViewState["LabelIDList"]; 
    } 
} 
override void OnLoad(..) 
{ 
    foreach (string id in LabelIDList) 
    { 
     // Make a function essentially like your code in createTaskLabel, 
     // you can use it there too 
     RecreateControl(id); 
    } 
} 

private void createTaskLabel(Guid GoalID, string Goal) 
{ 
    ... 
    // save the ID you just created 
    LabelIDList.Add(taskLabel.ID); 
} 

我才意識到,這些都是你要創建的標籤 - 所以實際上你可能應該保持跟蹤Text,而不是ID的。如果實際ID由於某種原因很重要,請記錄它們,請使用List<Tuple<string,string>>。更典型的情況是創建輸入控件,但在這種情況下,只要您在OnLoad上或之前重新創建它們(假設啓用了ViewState),ASP.NET將持久保存用戶輸入的數據。

+0

很好的回答 - 但我認爲它應該是「動態添加控件不持久...「。 – blech 2011-02-17 19:29:59

+0

好點,我的語言可能意味着其他的事情。改變。 – 2011-02-17 19:31:36

0

你看看Repeater控制嗎?這可能會讓我覺得更容易實現。 至少您不需要擔心自己的標籤控件創作。

1

昏暗LBL作爲新標籤 昏暗LBL1作爲新標籤 昏暗TXT作爲新文本框 昏暗txt1中作爲新的TextBox

lbl.Text = "Name" 
    lbl1.Text = "class" 
    Me.Controls.Add(lbl) 
    Me.Controls.Add(txt) 
    Me.Controls.Add(lbl1) 
    Me.Controls.Add(txt1)