首页 > 解决方案 > WebForms Repeater,设置文本框属性作为保存时的标识符

问题描述

我正在构建一个相对简单的 WebForm,它有两列,每列有大约 15 个固定输入字段,1 个是“其他”,计数为 (n)。

我创建了一个这样的中继器:

<asp:Repeater ID="rptClientItems" runat="server" OnItemDataBound="rptClientItems_ItemDataBound">
    <ItemTemplate>
        <div class="row">
            <div class="col-md-8">
                <asp:Label ID="lblItemType" runat="server"></asp:Label>
                <asp:TextBox ID="txtOtherItemTypeDescription" runat="server" Visible="false"  CssClass="lblandinput"></asp:TextBox>
            </div>
            <div class="col-md-4">
                <asp:TextBox ID="txtItemTextBoxArea" runat="server"></asp:TextBox>
            </div>
        </div>
    </ItemTemplate>
</asp:Repeater>

现在在我的ItemDataBound()函数中,我遍历所有数据库元素并在这些文本区域和标签中填充值。

问题 1是,当我单击SAVE(). 在我的保存功能中,我不知道哪个Textbox属于数据库中的哪个项目。

问题 2txtOtherItemTypeDescription是动态创建的,因此我使用保存Request.Form.GetValues("key")来获取所有值,但是我觉得这不是最有效的方法,因为这也会导致在第一次保存后编辑这些项目会很痛苦。

我对这个很好的例子比较陌生,解释会有很长的路要走。谢谢

标签: c#asp.netwebforms

解决方案


如果您想继续使用中继器,最简单的解决方案是添加一个隐藏的标签,因为中继器没有DataKeyField属性。你可以使用该标签来存储 ID。

<ItemTemplate>
    <asp:Label ID="hiddenID" runat="server" Text='<%# Eval("ID") %>' Visible="false"></asp:Label>
</ItemTemplate>

是您的保存方法,然后您可以循环中继器项目并获取文本框和标签的值。

foreach (RepeaterItem item in rptClientItems.Items)
{
   Label lb = item.FindControl("hiddenID") as Label;
   TextBox tb = item.FindControl("txtItemTextBoxArea") as TextBox;

   Label1.Text += lb.Text + ": " + tb.Text + "<br>";
}

推荐阅读