我在GridView
内创建UpdatePanel
,如下所示:
<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
的实际值 - 它们是&#39;总是0。
当我对DataBind()
进行调用时失败,因为自定义控件的初始化取决于ChangeID
和ScheduleID
是实际ID。
如何解决此问题?
答案 0 :(得分:2)
您的问题必须在嵌套用户控件填充其客户端内容的那一刻。这首先发生在Control和GridView上,因此在设置ChangeID
和ScheduleID
的值之前已经构建了UserControl。
解决此问题的一种方法是从Parent手动调用Control的构建。
首先,修改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
接下来,将ID
添加到GridView中的UserControl
<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