【问题标题】:How to page gridview that already has data bound to it?如何对已经绑定了数据的gridview进行分页?
【发布时间】:2015-07-10 11:27:55
【问题描述】:

我的网页上有一个查看按钮。只要用户单击此按钮,就会通过 Web 服务获取数据,然后将数据绑定到网格视图。但是当网格视图加载时,它只显示网格的 PageSize 属性中提到的行数,不显示页码。

private void FetchData(ref DataTable dt)
{
    string s_strResult = "";
    string s_strQuery = "";
    string s_strQueryType = "";

    try
    {                    
        grdSearchResult.DataSource = dt.DataSet.Tables["Result"];
        grdSearchResult.DataBind();
        tblSearchResult.Visible = true;            
        lblSearchResult.Text = "Total Items:" + dt.DataSet.Tables["Result"].Rows.Count;
    }
}

结果数据集包含 5000 行,每行 30 列。当 gridView 加载时,我只能看到 100 条记录(如 PageSize=100)。如何对结果进行分页?仅在单击按钮时才需要获取数据。 gridView页面索引更改代码如下:

protected void grdSearchResult_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
        try
        {
            grdSearchResult.PageIndex = e.NewPageIndex;
            grdSearchResult.DataBind();
        }
        catch (Exception ex)
        {
            DisplayMessage(GlobalClass.enumMsgType.Error, ex.Message);
        }
}

【问题讨论】:

  • 你能分享你的 asp.net 标记代码吗?
  • 你的问题不清楚。您是要一次获取所有记录还是要先获取前 100 条记录,然后在分页时单击获取另一条记录。如果您只想获取前 100 条记录,那么如何知道总记录。请提供有关该问题的更多详细信息。
  • शेखर.. 我在点击查看按钮时获取了所有数据。数据已绑定到网格。假设如果数据表包含 3000 条记录(在运行时经过验证和检查),并且网格的页面大小为 100,则只显示包含 100 条记录的一页。其余 2900 个条目未显示。
  • @scartag 网格视图看起来像:

标签: c# asp.net gridview


【解决方案1】:
【解决方案2】:

您可以将数据存储在 ViewstateSession 变量中,我建议使用属性作为包装器,如下所示:

private DataTable dtStored
{
    get { return (ViewState["dt"] == null) ? null : (DataTable)ViewState["dt"]; }
    set { ViewState["dt"] = value; }
}

现在您可以绑定 DataTable 并将其保存在属性中:

private void FetchData(ref DataTable dt)
{
    string s_strResult = "";
    string s_strQuery = "";
    string s_strQueryType = "";

    try
    {                    
        dtStored = dt.DataSet.Tables["Result"];
        grdSearchResult.DataSource = dtStored;
        grdSearchResult.DataBind();
        tblSearchResult.Visible = true;            
        lblSearchResult.Text = "Total Items:" + dt.DataSet.Tables["Result"].Rows.Count;
    }
}

并在 IndexPageChanging 方法中添加一行:

protected void grdSearchResult_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
        try
        {
            grdSearchResult.DataSource = dtStored;
            grdSearchResult.PageIndex = e.NewPageIndex;
            grdSearchResult.DataBind();
        }
        catch (Exception ex)
        {
            DisplayMessage(GlobalClass.enumMsgType.Error, ex.Message);
        }
}

如果您的数据太大,将其存储在Session 变量中可能比在Viewstate 中更好,因为第二个数据将从客户端传输到服务器,然后从服务器传输到当您停留在同一页面或将变量设置为 null 之前,客户端在每次回发中

【讨论】:

  • 我将数据表存储在会话变量中,因为我不希望它在每次回发时都发送到服务器,从而增加开销。在快速观察中,我可以验证会话变量是否具有数据表的所有值。但仍然没有显示索引号。如果没有显示索引号,则不会触发 IndexChange 事件。
  • 您是否将 AllowPaging="True" 属性添加到 aspx 中的 Gridview 控件?
  • 是的,你可能会看到我之前在其他 cmets 中分享的标记代码。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-26
  • 2021-12-18
  • 2019-06-09
  • 1970-01-01
  • 2011-05-14
  • 1970-01-01
相关资源
最近更新 更多