在asp:Repeater中动态地将Id提供给文本框(服务器端控件)

时间:2015-08-22 03:09:20

标签: c# asp.net repeater web-controls

在我的INSERT INTO table2 SELECT * FROM table1; 中 - 有一个隐藏字段,文本框和按钮。

当数据被绑定时,隐藏字段将获得用户ID,如下面的代码

<asp:Repeater></asp:Repeater>
将调用

和ItemDataBound事件,在此函数中,我从隐藏字段获取值,并将该值连接为文本框中的Id。如下面的代码

<asp:HiddenField ID="hide" Value='<%#Eval("UserId")%>' runat="server"/>

假设只有一条记录来自数据库且其UserId为1.则文本框ID应为&#34; textReplyArea1&#34;。从现在开始,一切都是正确的。

我不确定,这是将动态ID提供给转发器控件的正确方法,但我认为,这是正确的。

问题 -

当我点击按钮时,我通过从转发器中找到控件从Id获取转发器和文本框中的项目,然后它显示为空。

            TextBox txt = (TextBox)e.Item.FindControl("txtReplyArea");
            HiddenField hf = (HiddenField)e.Item.FindControl("hide");//1
            txt.ID = "txtReplyArea" + hf.Value;//txtReplyArea1

aspx页面代码

        int areaId = int.Parse((sender as Button).CommandArgument);//1
        string id="txtReplyArea"+areaId;//txtReplyArea1

        foreach (RepeaterItem item in repeaterBlog.Items)
        {
            TextBox tb = item.FindControl(id) as TextBox;//tb = null
        }

aspx.cs代码

<%@ Page Title="Messages" Language="C#" MasterPageFile="~/Menu.master" AutoEventWireup="true" CodeFile="Messages.aspx.cs" Inherits="Messages" %>

<asp:Content ID="Content1" ContentPlaceHolderID="head" Runat="Server">
</asp:Content>
<asp:Content ID="Content2" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
    <div style="width:70%;">
        <asp:Repeater ID="repeaterBlog" runat="server" OnItemDataBound="repeaterBlog_ItemDataBound">
        <HeaderTemplate>
            <table>
            </HeaderTemplate>
                <ItemTemplate>
                    <tr >
                        <td>
                            <asp:HiddenField ID="hide" Value='<%#Eval("UserId")%>' runat="server"/>
                            <asp:TextBox  ID="txtReplyArea" runat="server" TextMode="Multiline" Columns="70" Rows="8" Visible="false"></asp:TextBox>
                        </td>
                    </tr>
                    <tr>
                        <td style="margin-left:47%;">
                            <asp:Button ID="btnReply" runat="server" Text="Reply" OnClick="btnReplyClicked" AutoPostBack="True" CommandArgument='<%#Eval("UserId")%>'/>
                        </td>
                    </tr>

                </ItemTemplate>
                <FooterTemplate>
            </table>
                </FooterTemplate>
        </asp:Repeater>

    </div>
</asp:Content>

2 个答案:

答案 0 :(得分:1)

这对我有用。请注意,我从转发器中删除了EnableViewState并添加了OnItemDatabound事件。

<asp:Repeater ID="repeaterBlog" runat="server" OnItemDataBound="repeaterBlog_ItemDataBound">
    <HeaderTemplate>
        <table>
    </HeaderTemplate>
    <ItemTemplate>
        <tr>
            <td>
                <asp:HiddenField ID="hide" Value='<%#Eval("UserId")%>' runat="server" />
                <asp:TextBox ID="txtReplyArea" runat="server" TextMode="Multiline" Columns="70" Rows="8"
                    Visible="false"></asp:TextBox>
            </td>
        </tr>
        <tr>
            <td style="margin-left: 47%;">
                <asp:Button ID="btnReply" runat="server" Text="Reply" OnClick="btnReplyClicked" AutoPostBack="True"
                    CommandArgument='<%#Eval("UserId")%>' />
            </td>
        </tr>
    </ItemTemplate>
    <FooterTemplate>
        </table>
    </FooterTemplate>
</asp:Repeater>

    protected void Page_Load(object sender, EventArgs e)
    {
        DataTable dt = new DataTable();
        dt.Columns.Add("UserId");
        DataRow dr = dt.NewRow();
        dr[0] = 34;
        dt.Rows.Add(dr);
        repeaterBlog.DataSource = dt;
        repeaterBlog.DataBind();
    }

    public void repeaterBlog_ItemDataBound(object sender, RepeaterItemEventArgs e)
    {
        if (e.Item.ItemType == ListItemType.Item || e.Item.ItemType == ListItemType.AlternatingItem)
        {
            TextBox txt = (TextBox)e.Item.FindControl("txtReplyArea");
            HiddenField hf = (HiddenField)e.Item.FindControl("hide");
            txt.ID = "txtReplyArea" + hf.Value;
        }
    }


    protected void btnReplyClicked(object sender, EventArgs e)
    {
        int areaId = int.Parse((sender as Button).CommandArgument);
        string id = "txtReplyArea" + areaId;

        foreach (RepeaterItem item in repeaterBlog.Items)
        {
            TextBox tb = item.FindControl(id) as TextBox;
        }
    }

答案 1 :(得分:-1)

您可以尝试这样

<asp:TextBox ID='<%# "txtReplyArea" + Convert.ToString(Eval("UserId")%>)' runat="server" TextMode="Multiline" Columns="70" Rows="8" Visible="false"></asp:TextBox>