繁体   English   中英

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

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

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

如何解决此问题?

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM