如何在事件处理程序中从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事件处理程序中访问这个对象,因为我需要从这个表示当前行的对象中获取一些数据。
您无法访问OnTextChanged事件中中继器项的绑定对象。这样做的一种方法如下。
-
检索数据表后,将数据表保存在视图状态中
ViewState["Data"]=数据;
-
通过向中继器项目添加隐藏字段,将单个项目的键值绑定到隐藏字段
<asp:HiddenField runat="server"ID="hiddenFieldKey"值='<%#DataBinder.Eval(Container.DataItem,"key")%>'/>
-
您可以获取,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
参数,就像对Text
、var tb = (TextBox)sender;
所做的那样,然后访问该控件的Parent
属性。你可能需要提升几级才能找到你想要的东西,但这就是要点。然后你可以使用FindControl
或任何你需要的东西。