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

时间:2014-08-25 05:28:56

标签: c# asp.net

我有一个与某些DataTable绑定的Repeater。 (我在这里滑过标题模板)。

<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事件处理程序中访问此对象,因为我需要从此对象获取一些表示当前行的数据。

2 个答案:

答案 0 :(得分:0)

您可以使用sender参数,就像使用Textvar tb = (TextBox)sender;一样,然后访问该控件的Parent属性。您可能需要进行几个级别才能找到您正在寻找的内容,但这就是要点。然后你可以使用FindControl或者你需要的任何东西。

答案 1 :(得分:0)

您无法在OnTextChanged事件中访问转发器项的绑定对象。一种方法是这样做。

  1. 检索数据表后,将数据表保存在viewstate

    ViewState [&#34;数据&#34;] =数据;

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

    &LT; asp:HiddenField runat =&#34; server&#34; ID =&#34; hiddenFieldKey&#34;值=&#39;&lt;%#DataBinder.Eval(Container.DataItem,&#34; key&#34;)%&gt;&#39; /&GT;

  3. 您可以获取转发器项目,然后获取隐藏字段,以获取该行的密钥。然后,可以通过查找存储在viewstate中的表中的行来检索其他值。

    protected void Unnamed_TextChanged(object sender,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; }
    

    }

  4. 另一种方法是,如果你没有很多值可以获取,那么将所有必需值绑定到转发器项中的多个隐藏字段中,然后在OnTextChanged事件中获取这些隐藏字段值