数据绑定无法更改UpdatePanel内GridView内的自定义控件的值

时间:2017-04-07 19:52:47

标签: asp.net vb.net webforms asp.net-ajax aspxgridview

我在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个项目)。第一页正常工作。但是,当我尝试导航到其他页面之一时,自定义控件的初始化失败,因为它没有获得ChangeIDScheduleID的实际值 - 它们是&#39;总是0。

当我对DataBind()进行调用时失败,因为自定义控件的初始化取决于ChangeIDScheduleID是实际ID。

如何解决此问题?

1 个答案:

答案 0 :(得分:2)

您的问题必须在嵌套用户控件填充其客户端内容的那一刻。这首先发生在Control和GridView上,因此在设置ChangeIDScheduleID的值之前已经构建了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