在 asp.net 中从 Repeater 控件中获取已编辑的数据
Getting edited data from Repeater control in asp.net
我有一个列表
List<DashboardFinancialDates> financialDates = new List<DashboardFinancialDates>();
我将这个列表绑定到转发器作为数据源
FinancialDates.DataSource = financialDates;
FinancialDates.DataBind();
这是我的转发器控件
<asp:Repeater ID="FinancialDates" runat="server">
<HeaderTemplate>
<table class="DashboardConfigTable">
<thead>
<tr>
<th>Month</th>
<th>Start Date</th>
<th>End Date</th>
</tr>
</thead>
<tbody>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td> <%# Eval("Month") %></td>
<td><input type="text" class="datepicker" value="<%# Eval("StartDate")%>" /></td>
<td><input type="text" class="datepicker" value="<%# Eval("EndDate")%>" /></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</tbody>
</table>
</FooterTemplate>
</asp:Repeater>
现在我正在通过编辑文本框日期选择器进行更改,我认为转发器会使用更新后的数据自动修改数据源,但那没有发生。有人能告诉我如何在页面提交时从转发器中获取编辑后的值吗?
谢谢
您必须在回发时从 Repeater 检索数据。为此,您需要使用 ASP.NET 控件来显示和编辑标记中的数据:
<ItemTemplate>
<tr>
<td>
<asp:Label ID="lbl" runat="server" Text='<%# Eval("Month") %>'></asp:Label></td>
<td>
<asp:TextBox ID="txtDateFrom" runat="server" CssClass="datepicker" Text='<%# Eval("StartDate")%>' /></td>
<td>
<asp:TextBox ID="txtDateTo" runat="server" CssClass="datepicker" Text='<%# Eval("EndDate")%>' /></td>
</tr>
</ItemTemplate>
回发后,您可以像这样检索数据:
private IEnumerable<Tuple<string, DateTime, DateTime>> GetUpdatedItems()
{
var lst = new List<Tuple<string, DateTime, DateTime>>();
var items = rpt.Items
.OfType<RepeaterItem>()
.Where(x => x.ItemType == ListItemType.Item
|| x.ItemType == ListItemType.AlternatingItem);
foreach (var item in items)
{
var month = ((Label)item.FindControl("lbl")).Text;
var dateFromStr = ((TextBox)item.FindControl("txtDateFrom")).Text;
var dateToStr = ((TextBox)item.FindControl("txtDateTo")).Text;
var dateFrom = DateTime.Parse(dateFromStr);
var dateTo = DateTime.Parse(dateToStr);
lst.Add(Tuple.Create(month, dateFrom, dateTo));
}
return lst.ToArray();
}
代码循环访问 Repeater 项目并检索控件的值。
如果您需要项目的 ID,可以将 HiddenField 添加到 ItemTemplate 并在回发期间检索它。
我有一个列表
List<DashboardFinancialDates> financialDates = new List<DashboardFinancialDates>();
我将这个列表绑定到转发器作为数据源
FinancialDates.DataSource = financialDates;
FinancialDates.DataBind();
这是我的转发器控件
<asp:Repeater ID="FinancialDates" runat="server">
<HeaderTemplate>
<table class="DashboardConfigTable">
<thead>
<tr>
<th>Month</th>
<th>Start Date</th>
<th>End Date</th>
</tr>
</thead>
<tbody>
</HeaderTemplate>
<ItemTemplate>
<tr>
<td> <%# Eval("Month") %></td>
<td><input type="text" class="datepicker" value="<%# Eval("StartDate")%>" /></td>
<td><input type="text" class="datepicker" value="<%# Eval("EndDate")%>" /></td>
</tr>
</ItemTemplate>
<FooterTemplate>
</tbody>
</table>
</FooterTemplate>
</asp:Repeater>
现在我正在通过编辑文本框日期选择器进行更改,我认为转发器会使用更新后的数据自动修改数据源,但那没有发生。有人能告诉我如何在页面提交时从转发器中获取编辑后的值吗?
谢谢
您必须在回发时从 Repeater 检索数据。为此,您需要使用 ASP.NET 控件来显示和编辑标记中的数据:
<ItemTemplate>
<tr>
<td>
<asp:Label ID="lbl" runat="server" Text='<%# Eval("Month") %>'></asp:Label></td>
<td>
<asp:TextBox ID="txtDateFrom" runat="server" CssClass="datepicker" Text='<%# Eval("StartDate")%>' /></td>
<td>
<asp:TextBox ID="txtDateTo" runat="server" CssClass="datepicker" Text='<%# Eval("EndDate")%>' /></td>
</tr>
</ItemTemplate>
回发后,您可以像这样检索数据:
private IEnumerable<Tuple<string, DateTime, DateTime>> GetUpdatedItems()
{
var lst = new List<Tuple<string, DateTime, DateTime>>();
var items = rpt.Items
.OfType<RepeaterItem>()
.Where(x => x.ItemType == ListItemType.Item
|| x.ItemType == ListItemType.AlternatingItem);
foreach (var item in items)
{
var month = ((Label)item.FindControl("lbl")).Text;
var dateFromStr = ((TextBox)item.FindControl("txtDateFrom")).Text;
var dateToStr = ((TextBox)item.FindControl("txtDateTo")).Text;
var dateFrom = DateTime.Parse(dateFromStr);
var dateTo = DateTime.Parse(dateToStr);
lst.Add(Tuple.Create(month, dateFrom, dateTo));
}
return lst.ToArray();
}
代码循环访问 Repeater 项目并检索控件的值。
如果您需要项目的 ID,可以将 HiddenField 添加到 ItemTemplate 并在回发期间检索它。