代码之家  ›  专栏  ›  技术社区  ›  Youssef

中继器内的GridView分页

  •  1
  • Youssef  · 技术社区  · 17 年前

    我有一个嵌套在中继器中的gridview,我试图在gridview上启用分页,但没有太大成功。

    gridview数据绑定如下所示

    <asp:repeater....> 
        <asp:gridview id="GridView1" Datasource='<%# LoadData(CInt(Eval("Id"))) %>' 
             OnPageIndexChanging="GridViewPageIndexChanging" AllowPaging="true" 
    PageSize="10" ............. </asp:GridView>
    </asp:repeater>
    

    在我的 LoadData 方法获取对象列表:

    Public Function LoadData(ByVal Id As Integer) As IList(Of Client)
                Dim ds As IList(Of Client) = client.GetClientById(Id)
                Return ds
            End Function
    

    Protected Sub GridViewPageIndexChanging(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.GridViewPageEventArgs)
                sender.PageIndex = e.NewPageIndex
    End Sub
    

    3 回复  |  直到 10 年前
        1
  •  3
  •   Ruslan    17 年前

    您必须调用DataBind()。

    Dim grid as GridView = DirectCast(sender, GridView)
    grid.PageIndex = e.NewPageIndex
    grid.DataBind()
    

    编辑

    恐怕中继器是一个错误的控件,无法满足您的需要。问题源于这样一个事实,即当GridView的页面事件触发时,它不保留DataItem。因此“id”的计算结果为零,随后为零。顺便说一句,在C#中,您将得到一个空异常。

    我建议您改用数据列表:

    <asp:DataList ID="DataList" runat="server" DataKeyField="id">
        <ItemTemplate>
            <asp:GridView ID="Grid" runat="server"
                AllowPaging="true"
                PageSize="2"
                OnPageIndexChanging="Grid_PageIndexChanging"
                DataSource='<%# GetData(DirectCast(DataList.DataKeys(DirectCast(Container, DataListItem).ItemIndex), Integer)) %>'
            >
            </asp:GridView>
            <hr />
        </ItemTemplate>
    </asp:DataList>
    

    代码隐藏:

    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        If Not IsPostBack Then
            DataList.DataSource = New Integer() {1, 2, 3, 4, 5}.Select(Function(x) New With {.id = x})
            DataList.DataBind()
        End If
    End Sub
    
    Protected Function GetData(ByVal id As Integer) As String()
        Dim arr As String() = New String(4) {}
        For i As Integer = 0 To arr.Length - 1
            arr(i) = String.Format("id {0}; grid item {1}", id, i)
        Next
        Return arr
    End Function
    
    Protected Sub Grid_PageIndexChanging(ByVal sender As Object, ByVal e As GridViewPageEventArgs)
        Dim grid As GridView = DirectCast(sender, GridView)
        grid.PageIndex = e.NewPageIndex
        grid.DataBind()
    End Sub
    

    这段代码有效——我已经测试过了。虽然,我个人不喜欢使用绑定表达式。

        2
  •  1
  •   Youssef    17 年前

    我更进一步, 在我做了绑定之后,我得到了一个Eval异常。 我在数据源中将其更改为<%#LoadData(DataBinder.Eval(Container.DataItem,“Id”))%>

    绑定之后,我再也不会得到Eval异常。然而,我的网格仍然是空的。

    好的,我把id保存在哈希表中,然后用哈希表中的等效id重新绑定gridview,解决了这个问题。

    现在一切都好了,谢谢大家的帮助。

        3
  •  0
  •   Dan Appleyard    17 年前

    <asp:Repeater ID="rpt" runat="server" ...>
       <ItemTemplate>
          <asp:GridView id="gv1" runat="server" ...>
          .
          .
          .
          </asp:GridView>
       </ItemTemplate>
    </asp:Repeater>
    
    推荐文章