Skip to main content
 首页 » 编程设计

c#之将多个控件添加到 webform 中的面板

2024年01月29日28三少

我希望能够将多个标签控件添加到面板并在 onlick 事件中显示它们。我拥有的代码第一次执行了我想要的操作,然后在第二个 onlick 事件中将标签简单地替换为新标签,依此类推。

这是我目前所拥有的:

 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 再次触发时,相同的标签将被替换,而不是在其下方出现新的标签。

请您参考如下方法:

动态创建的控件在回发后不会保留。您需要跟踪您生成了多少控件,并每次都重新生成所有这些控件,以便按您想要的方式工作。基本实现:

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 很重要,那么请同时跟踪它们,使用 List<Tuple<string,string>>为了那个原因。不过,更典型的情况是创建输入控件,在这种情况下,只要您在 OnLoad 时或之前重新创建用户输入的数据(假设启用了 ViewState),ASP.NET 就会保留用户输入的数据。