2011-02-17 26 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)