如何在事件处理程序中从asp:Repeater获取项目

本文关键字:asp Repeater 获取 项目 事件处理 程序 | 更新日期: 2023-09-27 18:19:26

我有一个中继器,它与一些DataTable绑定。(这里我跳过了页眉模板)。

<asp:Repeater ID="rpt_users" runat="server" OnItemCommand="rpt_users_ItemCommand" OnItemDataBound="rpt_users_ItemDataBound">
    <ItemTemplate>
        <tr class="c0">
            <td><asp:CheckBox ID="CheckSelect" runat="server" /></td>
            <td>
                <asp:HyperLink ID="hpl_edit" runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "name") %>'
                        NavigateUrl='<%# DataBinder.Eval(Container.DataItem, "edit") %>'></asp:HyperLink></strong>
                <asp:LinkButton ID="btn_del" runat="server" CommandName="Remove" CommandArgument='<%# DataBinder.Eval(Container.DataItem, "key") %>'><img src="assets/img/delete.png" alt="<%#nodeDelete %>" title="<%#nodeDelete %>" class="ico-delpage icon-right" /></asp:LinkButton>
            </td>
            <td>
                <p><%# DataBinder.Eval(Container.DataItem, "country") %></p>
            </td>
            <td>
                <asp:TextBox runat="server" Text='<%# DataBinder.Eval(Container.DataItem, "daysleft") %>' OnTextChanged="Unnamed_TextChanged" AutoPostBack="true"/>
            </td>
        </tr>
    </ItemTemplate>
<asp:Repeater>

我将OnTextChanged事件与一个处理程序关联:

protected void Unnamed_TextChanged(object sender, EventArgs e)
{
    var txt = (sender as TextBox).Text;
    int newDays = 0;
    try
    {
        newDays = int.Parse(txt);
    }
    catch { return; }
}

那么,如何在Repeater中获取与当前行关联的整个对象呢?我需要在我的OnTextChanged事件处理程序中访问这个对象,因为我需要从这个表示当前行的对象中获取一些数据。

如何在事件处理程序中从asp:Repeater获取项目

您无法访问OnTextChanged事件中中继器项的绑定对象。这样做的一种方法如下。

  1. 检索数据表后,将数据表保存在视图状态中

    ViewState["Data"]=数据;

  2. 通过向中继器项目添加隐藏字段,将单个项目的键值绑定到隐藏字段

    <asp:HiddenField runat="server"ID="hiddenFieldKey"值='<%#DataBinder.Eval(Container.DataItem,"key")%>'/>

  3. 您可以获取,repeater项,然后获取隐藏字段,以获取行的键。然后,可以通过查找存储在视图状态中的表中的行来检索其他值。

    protected void Unnamed_TextChanged(对象发送方,EventArgs e){

    var txt = (sender as TextBox).Text;
    var repeaterItem = (sender as TextBox).NamingContainer as RepeaterItem;
    var hiddenFieldKey =repeaterItem.FindControl("hiddenFieldKey") as HiddenField;
    // Get data from viewstate
    DataTable data = ViewState["Data"] as DataTable;
    var dataRow= data.Rows.Find(hiddenFieldKey.Value);
    //You can use this row to get the values of the other columns
    int newDays = 0;
    try
    {
        newDays = int.Parse(txt);
    }
    catch { return; }
    

    }

另一种方法是,如果您没有太多的值要获取,那么将所有所需的值绑定到中继器项目中的多个隐藏字段中,然后在OnTextChanged事件中获取这些隐藏字段值

您可以使用sender参数,就像对Textvar tb = (TextBox)sender;所做的那样,然后访问该控件的Parent属性。你可能需要提升几级才能找到你想要的东西,但这就是要点。然后你可以使用FindControl或任何你需要的东西。