ASP.NET 手工绑定数据源时分页操作产生的问题
先上代码如下:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Data" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;
DataTable dt = new DataTable();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT * FROM PRODUCTS";
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = cmd;
adapter.Fill(dt);
conn.Close();
grdPaging.DataSource = dt;
grdPaging.DataBind();
}
}
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="grdPaging" runat="server" AllowPaging="true" PageSize="10" AutoGenerateColumns="false">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Button ID="asd" runat="server" Text='<% #Eval("ProductID")%>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</form>
</body>
</html>
很显然我们手工对grdPaging尽心数据绑定,然后启用了AllowPaging,好的,在浏览其里面查看,结果良好
(图片比较小,大家忍着点,实在忍不了的我也没办法,嘿嘿)
可是当点击下面的分页页码的时候就会出现问题了
GridView“grdPaging”激发了未处理的事件“PageIndexChanging”。
上网上查询结果说手动绑定到数据原的时候必须亲自处理PageIndexChanging事件,不爽啊.
于是对上述问题进行改进,改进代码如下
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Data" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
using (SqlConnection conn = new SqlConnection())
{
conn.ConnectionString = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;
DataTable dt = new DataTable();
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT * FROM PRODUCTS";
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = cmd;
adapter.Fill(dt);
conn.Close();
grdPaging.DataSource = dt;
grdPaging.DataBind();
}
}
}
protected void grdPaging_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
this.grdPaging.PageIndex = e.NewPageIndex;
this.grdPaging.DataBind();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="grdPaging" runat="server" AllowPaging="true" PageSize="10" AutoGenerateColumns="false"
OnPageIndexChanging="grdPaging_PageIndexChanging">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Button ID="asd" runat="server" Text='<% #Eval("ProductID")%>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</form>
</body>
</html>
添加了处理的PageIndexChanging事件,本以为大功告成,可是运行一看,当切换页码的时候,GridView中的数据成了空的了.什么原因?
后来经我"""""猜测"""""猜测的,要是大家知道官方的标准的解释,请给我留言,站着谢谢了.
我猜测的原因是:ASP.NET,在Page_Load中对GridView进行数据绑定后,dt就消失了(作为内存垃圾),而GridView.DataSource也跟他脱离了关系,要想维持原来的关系对不其没办法,你只有重新指定dt,重新绑定,啊,天啊,你怎么这么惨
于是重新进行修改:
![](https://www.cnblogs.com/Images/OutliningIndicators/ContractedBlock.gif)
![](https://www.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
<%@ Page Language="C#" %>
<%@ Import Namespace="System.Data.SqlClient" %>
<%@ Import Namespace="System.Data" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">
protected void Page_Load(object sender, EventArgs e)
{
if (!Page.IsPostBack)
{
grdPaging.DataSource = GetDataTable();
grdPaging.DataBind();
}
}
private DataTable GetDataTable()
{
SqlConnection conn = new SqlConnection();
DataTable dt = new DataTable();
conn.ConnectionString = ConfigurationManager.ConnectionStrings["NorthwindConnectionString"].ConnectionString;
SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT * FROM PRODUCTS";
SqlDataAdapter adapter = new SqlDataAdapter();
adapter.SelectCommand = cmd;
adapter.Fill(dt);
return dt;
}
protected void grdPaging_PageIndexChanging(object sender, GridViewPageEventArgs e)
{
this.grdPaging.PageIndex = e.NewPageIndex;
this.grdPaging.DataSource = GetDataTable();
this.grdPaging.DataBind();
}
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title>无标题页</title>
</head>
<body>
<form id="form1" runat="server">
<div>
<asp:GridView ID="grdPaging" runat="server" AllowPaging="true" PageSize="10" AutoGenerateColumns="false"
OnPageIndexChanging="grdPaging_PageIndexChanging">
<Columns>
<asp:TemplateField>
<ItemTemplate>
<asp:Button ID="asd" runat="server" Text='<% #Eval("ProductID")%>' />
</ItemTemplate>
</asp:TemplateField>
</Columns>
</asp:GridView>
</div>
</form>
</body>
</html>
OK终于搞定了.运行没问题
后记:微软的GridView对手工数据绑定支持的不好是因为他倡导使用SqlDataSource,ObjectDataSource等控件实现更安全,更强大,更迅捷的功能.
再后记:我的博客好可怜,没有人留言啊,大家看着办吧.呵呵...