【问题标题】:Gridview pagination not working?Gridview分页不起作用?
【发布时间】:2017-05-13 19:58:26
【问题描述】:

当我尝试为gridview 实现分页时,我做了如下所示 但是当我点击页码时,页面没有加载。没有出现异常或错误?

我尝试了here 的建议,但没有成功。

最后总体上有什么代码改进吗?这可以用更好的方式完成吗?

代码标记

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="LoanReports.aspx.cs" Inherits="BankingDemo.LoanReports" %>

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Banking Site (Demo)</title>
</head>
<body>
    <form id="form" runat="server">
        <asp:GridView ID="GridView1" runat="server" OnPageIndexChanging="GridView1_PageIndexChanging" AutoGenerateColumns="False" AllowPaging="true" PageSize="10" HeaderStyle-BackColor="CornflowerBlue" HeaderStyle-Font-Bold="true" HeaderStyle-ForeColor="White" CellPadding="5" AllowSorting="True" A`enter code here`llowCustomPaging="False" AutoGenerateSelectButton="True" PagerSettings-Mode="Numeric">
             <Columns>
                 <asp:BoundField DataField="Code" HeaderText="Code" />
                 <asp:BoundField DataField="name" HeaderText="name" />
                 <asp:BoundField DataField="Continent" HeaderText="Continent" />
                 <asp:BoundField DataField="Region" HeaderText="Region" />
                 <asp:BoundField DataField="SurfaceArea" HeaderText="SurfaceArea" />
<%--                 <asp:BoundField DataField="IndepYear" HeaderText="IndepYear" />
                 <asp:BoundField DataField="population" HeaderText="population" />
                 <asp:BoundField DataField="LifeExpectancy" HeaderText="LifeExpectancy" />
                 <asp:BoundField DataField="GNP" HeaderText="GNP" />
                 <asp:BoundField DataField="GNPOld" HeaderText="GNPOld" />
                 <asp:BoundField DataField="LocalName" HeaderText="LocalName" />
                 <asp:BoundField DataField="GovernmentForm" HeaderText="GovernmentForm" />
                 <asp:BoundField DataField="HeadOfState" HeaderText="HeadOfState" />
                 <asp:BoundField DataField="Capital" HeaderText="Capital" />
                 <asp:BoundField DataField="Code2" HeaderText="Code2" />--%>
             </Columns>
        </asp:GridView>
    </form>
</body>
</html>

c#代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using MySql;
using MySql.Data;
using MySql.Data.Types;
using MySql.Data.MySqlClient;
using System.Configuration;
using System.Data;

namespace BankingDemo
{
    public partial class LoanReports : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            if(!this.IsPostBack)
            {
                get_table();
            }
        }
        private void get_table()
        {
            string ConnStr = ConfigurationManager.ConnectionStrings["ConnConfig"].ConnectionString;
            string cmdTxt = @"select Code,
                                     name,
                                     Continent,
                                     Region,
                                     SurfaceArea,
                                     IndepYear,
                                     population,
                                     LifeExpectancy,
                                     GNP,
                                     GNPOld,
                                     LocalName,
                                     GovernmentForm,
                                     HeadOfState,
                                     Capital,
                                     Code2
                                from world.country";

            try
            {
                using (MySqlConnection conn = new MySqlConnection(ConnStr))
                using (MySqlCommand cmd = new MySqlCommand(cmdTxt))
                {
                    conn.Open();

                    using (MySqlDataAdapter myadapter = new MySqlDataAdapter())
                    {
                        cmd.Connection = conn;
                        myadapter.SelectCommand = cmd;

                        using (DataTable dt = new DataTable())
                        {
                            myadapter.Fill(dt);
                            GridView1.DataSource = dt;
                            GridView1.DataBind();
                        }
                    }
                }
            }
            catch (Exception ex)
            {

            }
        }

        protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
        {
            GridView1.PageIndex = e.NewPageIndex;
            GridView1.DataBind();
        }
    }
}

【问题讨论】:

  • get_table() - 1. 打破命名约定。 2.告诉code reader它会返回data table,不会绑定grid。我强烈认为应该有两种方法,一种返回数据(从DAL 获取),另一种将数据绑定到网格。

标签: c# asp.net gridview


【解决方案1】:

作为一个简单的解决方案,更改 PageIndexChanging 方法。只需在您的代码中调用 get_table() 方法。查看更新后的代码。

protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e)
    {
        GridView1.PageIndex = e.NewPageIndex;
        get_table();
    }

【讨论】:

  • 是的,你是对的,我的朋友,我还发现今天我刚刚将 GridView1.DataBind(); 更改为 this.get_table_method();
【解决方案2】:

您需要在GridView1_PageIndexChanging 事件处理程序中重新绑定网格数据源。为此,您需要稍微重构代码,以便get_table() 将返回DataTable。它不应该将数据表绑定到网格。 get_table() 是个可怕的名字。请改用GetTable 或事件更好的GetCountries

所以你的新代码看起来像:

Page_Load(..) {
    if (!IsPostBack) {
        var dt = GetCountries();
        BindGrid(GridView1, dt);
    }
}

BindGrid(GridView grid, DataTable dt) {
    grid.DataSource = dt;
    grid.DataBind();
}

GetCountries() {
    // your get_table() code here
    return dt;
}

GridView1_PageIndexChanging(..) {
    GridView1.PageIndex = e.NewPageIndex;
    var dt = GetCountries();
    BindGrid(GridView1, dt);
}

【讨论】:

  • 您忘记将 GridView1 添加到 Page_Load 中对 BindGrid 的第一次调用中。
  • @wazz 谢谢我的朋友,我现在就试试吧……但根据你的经验,他们有更好的方法……现在代码看起来很乱!
  • @wazz - 已更新。谢谢。
  • @sam - GetCountries 不应出现在页面中。国家应该由数据访问层返回。除此之外,您无法从此页面的代码中删除任何内容。
猜你喜欢
  • 1970-01-01
  • 2010-10-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多