【问题标题】:Add multiple controls to panel in webforms将多个控件添加到 Web 表单中的面板
【发布时间】:2011-02-17 19:18:10
【问题描述】:

我希望能够将多个标签控件添加到面板并在 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);
 }

因此,例如,这会创建一个具有 uniqueID(在其他地方处理)的新标签,并将其放置在面板中并显示它。当 onlick 再次触发时,相同的标签会被简单地替换,而不是在其下方出现一个新标签。

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

    回发后不会保留动态创建的控件。您需要跟踪已生成的控件数量并每次重新生成所有控件,以便按您的意愿工作。基本实现:

    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&lt;Tuple&lt;string,string&gt;&gt;。不过,更典型的情况是创建输入控件,在这种情况下,只要您在 OnLoad 或之前重新创建用户输入的数据(假设启用了 ViewState),ASP.NET 就会保留用户输入的数据。

    【讨论】:

    • 很好的答案——但我认为它应该是“动态添加的控件不会持久化...”。
    • 谢谢,我会立即尝试并返回。
    • 我解决了这个问题。但是,我没有使用上面的解决方案,尽管它确实适用于测试应用程序,所以我很感激。我最终做的是根据从数据库返回的数据创建控件。对于返回的每一行,我创建了一个带有 id 和文本的新标签。
    【解决方案2】:

    将 lbl 调暗为新标签 将 lbl1 调暗为新标签 将 txt 调暗为新的文本框 将 txt1 调暗为新文本框

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

    【讨论】:

      【解决方案3】:

      你看Repeater控件了吗?我认为这可能会使实施起来更容易一些。 至少您不必自己担心标签控件的创建。

      【讨论】:

      • 我很欣赏这个建议。我通过不同的路线解决了我的问题。我通过基于从数据库查询返回的数据构建控件来事后创建必要的控件。
      猜你喜欢
      • 2013-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-28
      • 2011-01-20
      • 2021-05-18
      相关资源
      最近更新 更多