代码之家  ›  专栏  ›  技术社区  ›  Nick Allen

如何基于用户输入添加持久动态控件(不是在初始页面加载时)

  •  0
  • Nick Allen  · 技术社区  · 14 年前

    用户发起 脚本。。。

    在我的演示中,我有一个占位符、两个按钮和一个文本

    <div>
        <asp:PlaceHolder ID="phResponses" runat="server" />
    </div>
    <div>
        <asp:Button ID="btnAdd" Text="Add" runat="server" OnClick="Add"/>
        <asp:Button ID="btnInspect" Text="Inspect" runat="server" OnClick="Inspect"/>
    </div>
    <div>
        <asp:Literal ID="litResult" runat="server"/>
    </div>
    

    protected void Page_Init(object sender, EventArgs e)
    {
        BuildControls();
    }
    
    protected void Add(object sender, EventArgs e)
    {
        BuildControls();
    }
    
    protected void BuildControls()
    {
        phResponses.Controls.Add(new LiteralControl { ID = "response_" + _Count.ToString() });
        _Count++;
    }
    

    _Count是一个静态成员变量,使我能够为新控件拥有唯一的id。我意识到我需要重新构建页面初始化上的动态控件,但问题是每次回发时我都会得到两个新的文本控件。另外,如果将任何文本属性放入新控件中,则在重新生成控件时该属性将丢失。

    我用下面的方法来检查回答

    protected void Inspect(object sender, EventArgs e)
    {
        foreach (var control in phResponses.Controls)
        {
            if (control is LiteralControl)
            {
                litResults.Text += "<p>" + control.Text + " : " + control.ID + "</p>";
            }
        }
    }
    

    它本身添加了另一个不需要的控件,因为在初始化页上重新生成

    1 回复  |  直到 9 年前
        1
  •  0
  •   Community Mike Kinghan    7 年前

    我不太明白你在问什么,但看起来你只是想确保 BuildControls 每个生命周期只调用一次。您可以通过进行以下更改来完成此操作:

    1. private bool _isControlsBuilt = false; .
    2. 改变 Page_Init 检查 _isControlsBuilt 打电话之前 生成控件 .
    3. _isControlsBuilt公司 true 生成控件 .
    4. 确保 生成控件 page lifecycle 页面初始化

    至于在回发时丢失控件的值,那将是它们永远不会到达viewstate。我不知道是否行得通,但我的第一个猜测是在结尾加一行 打电话 Page.RegisterRequiresControlState :

    protected void BuildControls()
    {
        LiteralControl newLiteral = new LiteralControl { ID = "response_" + _Count };
        this.RegisterRequiresControlState(newLiteral);
        phResponses.Controls.Add(newLiteral);
    
        _Count++;
        _isControlsBuilt = true;
    }
    

    如果这不起作用(这可能意味着它是视图状态,而不是控制状态对您来说很重要),您可能需要查看滚动您自己的视图状态。我写过怎么做的 my answer to #3854193