【问题标题】:Dynamic controls in postback回发中的动态控件
【发布时间】:2011-11-08 14:07:23
【问题描述】:

我正在尝试将一组 LinkBut​​tons 添加到 UpdatePanel 中 GridView 的 PagerRow。我正在使用 RowCreated 事件来实例化和添加这些。我遇到的问题是点击处理程序只被触发了第二次。

我使用

创建链接按钮
Protected Sub grd_RowCreated(ByVal sender As Object, ByVal e As GridViewRowEventArgs)
    If (e.Row.RowType = DataControlRowType.Pager) Then
        Dim pageSizer = New GridViewPageSizer(grdItems)
        e.Row.Cells(0).Controls.AddAt(0, pageSizer)
    End If
End Sub

要自己创建 LinkBut​​tons,我正在使用

    Dim lnkSize = New LinkButton() With { _,
        .Text = size.ToString(), _
        .CommandArgument = size.ToString(), _
        .ID = "pageSizer" & size
    }
    AddHandler lnkSize.Click, AddressOf lnkPageSize_Click ' an EventHandler which just changes pagesize based on CommandArgument
    liSize.Controls.Add(lnkSize)

GridViewPageSizer 继承 HtmlGenericControl 并为每个按钮的单击添加一个事件处理程序。在每次回发时,都会重新创建寻呼机行,因此旧按钮被替换为新按钮,并且它们的事件处理程序仅在第二次单击时触发。如果我检查 !IsPostBack,按钮在第一次点击后消失。在单击按钮并且页面大小发生变化后,我尝试重新绑定网格,但同样的事情发生了。有没有办法解决这个问题?

【问题讨论】:

    标签: asp.net gridview postback dynamic-controls


    【解决方案1】:

    为了让 EventHandler 正确触发,您需要在 Page Init/PreInit 上绑定它。

    制作一个会话指示器,并在回发时,在 Page Init 上检查该会话。

    如果满足条件,而不是在 RowCreated 事件上重新创建它,而是在页面初始化上重新创建控件和事件。

    这一次,事件将正确触发。

    【讨论】:

    • 这会有问题,因为我无法访问 Page_Init 中的控件。它们在 UserControl 中,并且在 UserControl 为 DataBound 之前没有 BottomPagerRow,在 Page_Init 之后。
    猜你喜欢
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-24
    相关资源
    最近更新 更多