GridView在转发器内部进行分页

时间:2009-03-13 15:35:07

标签: asp.net

我有一个嵌套在转发器中的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

我的代码不会更改gridview中的页面,我错过了什么吗?

非常感谢任何帮助。

3 个答案:

答案 0 :(得分:3)

您必须调用DataBind()。

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

修改

由于我还没有发表评论并且为答案创建另一个答案会让一切变得混乱,我只会编辑这个。

我担心Repeater是一个错误的控件,可用于你想要的东西。问题源于当GridView的页面事件触发时它不保留DataItem的事实。因此,“id”被评估为零,随后为零。顺便说一句,在C#中你会得到一个空例外。

我建议你改用DataList:

<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

此代码有效 - 我测试过。虽然,我个人不喜欢使用绑定表达式。

答案 1 :(得分:1)

我更进了一步, 在我进行绑定后,我在Eval上得到了一个例外。 我在数据源中将其更改为&lt;%#LoadData(DataBinder.Eval(Container.DataItem,“Id”))%&gt;

绑定后我不再获得Eval异常了。但是我的网格仍然是空的。

[更新]

好的,我通过将我的Ids保留在哈希表中来解决它,并使用哈希表中的等效id重新绑定我的gridview。

现在感谢大家的帮助。

答案 2 :(得分:0)

我看到你的标记有一件事。您的示例直接在Repeater控件中具有GridView。您将在ItemTemplate中使用它。

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