代码之家  ›  专栏  ›  技术社区  ›  Younes

在更改一个值c.net 3.5时向窗体添加新字段

  •  1
  • Younes  · 技术社区  · 15 年前

    我在写表格。此表单中有一个字段包含数字。例如,如果这个数字是3,我希望这个表单启用9个新字段,这样我就可以为这3个新参与者添加值。

                <li>
                    <asp:Label ID="lblAantaldeelnemendeploegen" runat="server" Text="Label">Aantal deelnemende ploegen: </asp:Label>
                    <asp:TextBox ID="tbAantaldeelnemendeploegen" AutoPostBack="true" runat="server"></asp:TextBox>
                </li>
    

    这是我要发回的label/textbox,以查看需要为用户启用多少个新字段。我的代码隐藏现在有这个代码来检查回发:

     if (Page.IsPostBack)
        {
            Request.Form
        }
    

    现在如何向此表单添加示例3字段?什么样的控制方式最适合我?或者如何动态地添加这些新字段?我是新来的,所以我问了很多。

    1 回复  |  直到 15 年前
        1
  •  1
  •   Andreas Niedermair    15 年前

    休斯敦大学。。。我希望你不是ASP.NET的新手。否则它可能会变成恐怖!

    原因: 如果动态创建控件,则在第一次回发之后,每个回发之前 AttachPostData SecondTry . 在再次回发后,您必须为控件提供相同的id,否则viewstate/postbackdata将不会被附加,并最终导致异常。

    假设你们都知道,这里有一些基本的权杖:

    <asp:PlaceHolder runat="server" ID="phDynamicControls" />
    

    和代码隐藏

    function /* add name and correct signature here - eventHandler for saveButton click-event */
    {
        // TODO rebuild controls from other postBacks somewhere
        var control = new TextBox
        {
            ID = "myUniqueID"
        }
        this.phDynamicControls.Controls.Add(control);
    }
    

    扩展它,为了避免陷阱,请对您的页面执行以下操作!

    protected override void LoadViewState(object savedState)
    {
        base.LoadViewState(savedState);
        // this will only be executed if postback
        // recreate controls from former postback
    }
    
    protected override object SaveViewState()
    {
        // TODO persist control hirarchie in here!! to allow restoring on next LoadViewState()
        return base.SaveViewState();
    }
    

    一个非常简单的方法是: 为什么不使用中继器

    <asp:Repeater runat="sever" ID="repDynamicControls">
        <ItemTemplate>
            <asp:TextBox runat="server" ID="txtCustom"/>
        </ItemTemplate>
    </asp:Repeater>
    

    你的暗号

    function /* add name and correct signature here - eventHandler for saveButton click-event */
    {
        // TODO find out number of items!
        var items = 3;
        this.repDynamicControls.DataSource = Enumerable.Range(0, items); // zero-offset here
        this.repDynamicControls.DataBind();
    }
    

    但是仍然有以下问题:如果没有 generate new item -按钮被触发。

    最后,您将至少绑定两次:

    • 第一个加载视图状态
    • 事件处理程序上的第二个(可选)