[英]Data binding fails to change values for custom control inside GridView inside an UpdatePanel
我在这样的UpdatePanel
创建一个GridView
:
<asp:ScriptManager runat="server" EnablePartialRendering="true" />
<div id="masterHistoryDialog" style="display: none">
<asp:UpdatePanel runat="server" ChildrenAsTriggers="true" UpdateMode="Always">
<Triggers>
<asp:AsyncPostBackTrigger ControlID="historyRepeater" EventName="PageIndexChanging" />
</Triggers>
<ContentTemplate>
<asp:GridView ID="historyRepeater" AutoGenerateColumns="false" runat="server" AllowPaging="true" AllowSorting="false" PagerSettings-NextPageText="Next" PagerSettings-PreviousPageText="Previous" PageSize="4" OnPageIndexChanging="historyRepeater_PageIndexChanging">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<uc:CustomCalendarControl ChangeID='<%# DataBinder.Eval(Container.DataItem, "Item1") %>' ScheduleID='<%# DataBinder.Eval(Container.DataItem, "Item2") %>' runat="server" />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</ContentTemplate>
</asp:UpdatePanel>
</div>
PageIndexChanging
事件将按预期触发,调用以下事件处理程序:
Protected Sub historyRepeater_PageIndexChanging(sender As Object, e As GridViewPageEventArgs)
historyRepeater.PageIndex = e.NewPageIndex
historyRepeater.DataSource = GetSchedules()
historyRepeater.DataBind()
End Sub
CustomCalendarControl
是一个自定义控件。
我确认GetSchedules
实际上正在获取我的整个数据集。
我分页数据,每页有4个自定义控件(共5页20个项目)。 第一页工作正常。 但是,当我尝试导航到其他页面之一时,自定义控件的初始化失败,因为它没有获取ChangeID
或ScheduleID
的实际值-它们始终为0。
当我调用DataBind()
时,它失败,因为自定义控件的初始化取决于ChangeID
和ScheduleID
是实际的ID。
如何解决此问题?
您的问题必须在何时嵌套用户控件填充其客户端内容。 这首先发生在控件上,然后发生在GridView上,因此已经在设置ChangeID
和ScheduleID
的值之前构建了UserControl。
解决此问题的一种方法是从父级手动调用控件的构建。
首先,修改UserControl,使其具有公共功能以正确显示值
public string ChangeID { get; set; }
public string ScheduleID { get; set; }
protected void Page_Load(object sender, EventArgs e)
{
setUCValues();
}
public void setUCValues()
{
Label1.Text = ChangeID;
Label2.Text = ScheduleID;
}
Public Property ChangeID As String
Get
End Get
Set
End Set
End Property
Public Property ScheduleID As String
Get
End Get
Set
End Set
End Property
Protected Sub Page_Load(ByVal sender As Object, ByVal e As EventArgs)
setUCValues
End Sub
Public Sub setUCValues()
Label1.Text = ChangeID
Label2.Text = ScheduleID
End Sub
接下来,向GridView中的UserControl添加一个ID
<uc:CustomCalendarControl ID="calendarControl" runat="server" ChangeID=
然后在PageIndexChanging中,循环所有行并调用该函数
protected void historyRepeater_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
//databinding
foreach (GridViewRow row in historyRepeater.Rows)
{
WebUserControl1 control = row.FindControl("calendarControl") as WebUserControl1;
control.setUCValues();
}
}
Protected Sub historyRepeater_PageIndexChanging(sender As Object, e As GridViewPageEventArgs)
'databinding
For Each row As GridViewRow In historyRepeater.Rows
Dim control As WebUserControl1 = CType(row.FindControl("calendarControl"),WebUserControl1)
control.setUCValues
Next
End Sub
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.