在 Repeater 控件中访问文本框

25
我能想到的所有方法都很不专业。有没有正确或至少最常用的方法?
我正在从LINQ-to-SQL查询中检索一组图像,并将其和其他数据绑定到一个重复器中。我需要为重复器中的每个项目添加一个文本框,以便用户可以更改每个图像的标题,非常类似于Flickr。
如何访问重复器控件中的文本框并知道该文本框属于哪个图像?
这是重复器控件的外观,带有一个提交按钮,该按钮将更新Linq-to-SQL中的所有图像行: alt text http://casonclagg.com/layout.jpg 编辑:
此代码有效
只是确保不要像我一样在if(!Page.IsPostBack)之外进行绑定,否则可能会丢失值.. 噢。
<asp:Repeater ID="Repeater1" runat="server">
    <ItemTemplate>
        <div class="itemBox">
            <div class="imgclass">
                <a title='<%# Eval("Name") %>' href='<%# Eval("Path") %>' rel="gallery">
                    <img alt='<%# Eval("Name") %>' src='<%# Eval("Path") %>' width="260" />
                </a>
            </div>
            <asp:TextBox ID="TextBox1" Width="230px" runat="server"></asp:TextBox>
        </div>
    </ItemTemplate>
</asp:Repeater>

并点击提交:

protected void Button1_Click(object sender, EventArgs e)
{
    foreach (RepeaterItem item in Repeater1.Items)
    {
        TextBox txtName = (TextBox)item.FindControl("TextBox1");
        if (txtName != null)
        {
            string val = txtName.Text;
            //do something with val
        }
    }
}

你是在 postback 后尝试访问客户端还是服务器上的文本框? - NakedBrunch
3个回答

34

你尝试过在按钮点击事件中使用以下代码吗:

foreach (RepeaterItem item in Repeater1.Items)
{
      TextBox txtName= (TextBox)item.FindControl("txtName");
      if(txtName!=null)
      {
      //do something with txtName.Text
      }
      Image img= (Image)item.FindControl("Img");
      if(img!=null)
      {
      //do something with img
      }
}

/* txtName和Img分别是Repeater中文本框和图像控件的ID。 */

希望这可以帮助到您。


你不知道“txtName”的值,对吧? - Jason
1
在上面的例子中,您将使用txtName.Text属性获取该值。 - Ashish Gupta
3
没关系,我很蠢。在我的页面加载中没有添加 if(!Page.IsPostback) 代码,所以文本框一直被重置了。请忽略前面的一切。=D - Jason
1
谢谢,在你的编辑中,TextBox1是文本框控件的名称,你可以使用FindControl("TextBox1")获取该文本框。如果你在Img标记中添加runat="server"并为其指定一个ID,比如Id="imgPuppy",那么你可以使用FindControl("imgPuppy")获取该图像。如果需要更多细节,请告诉我。 - Ashish Gupta
如果我想循环遍历所有控件并仅获取文本框并将其添加到列表中,该怎么办? - Si8
显示剩余2条评论

12

.aspx

        <asp:Repeater ID="rpt" runat="server" EnableViewState="False">
        <ItemTemplate>
                <asp:TextBox ID="txtQty" runat="server" /> 
        </ItemTemplate>
        </asp:Repeater>

.cs

        foreach (RepeaterItem rptItem in rpt.Items)
        {
            TextBox txtQty = (TextBox)rptItem.FindControl("txtQty");
            if (txtQty != null) { Response.Write(txtQty.Text); }          
        }

务必在您的重复器中添加EnableViewState="False",否则您将得到空字符串。(这浪费了我的时间,请不要浪费您的时间 :))


如果我想获取所有文本框并将其添加到列表中,以将“readonly”属性设置为true,该怎么办? - Si8

0

在回传时,您可以迭代重复器中的RepeaterItems集合。然后,您可以使用类似以下代码检索每个TextBox:

TextBox tbDemo = (TextBox)rptr.Items[index].FindControl("textBox");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接