【问题标题】:Data binding fails to change values for custom control inside GridView inside an UpdatePanel数据绑定无法更改 UpdatePanel 内 GridView 内的自定义控件的值
【发布时间】:2017-09-03 07:26:19
【问题描述】:

我正在像这样在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。

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

    您的问题与嵌套用户控件填充其客户端内容的时间有关。这首先发生在 Control 和 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
    

    【讨论】:

    • 有没有办法让DataBind() 调用成功?
    • 不幸的是,这似乎并不能解决问题。有没有不同的方法来处理它?
    • 数据绑定成功。它是导致您出现问题的页面生命周期。首先触发 UserControl 的 Page_Load,然后触发PageIndexChanging 事件。这就是你的问题。
    猜你喜欢
    • 2014-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 2019-09-21
    • 2019-07-27
    相关资源
    最近更新 更多