我使用的是datalist绑定的方式获取数据,分页的时候遇到了困难:(绑定代码如下)
<asp:DataList runat="server" ID="DataList2" BorderWidth="0" BorderColor="Red" DataSourceID="SqlDataSource1" RepeatColumns="2">
<ItemTemplate>
<table>
<tr>
<td>
<asp:Image ID="imagedata" runat="server" Width="65" Height="92" ImageUrl='<%# "~/Default.aspx?id=" + DataBinder.Eval(Container.DataItem,"[\"ImageID\"]").ToString() %>'/>
</td>
<td width="120" height="92">
<b>A:</b><asp:Label ID="Label2" runat="server" Text='<%# Eval("ImageDescription") %>'></asp:Label><br />
</td>
</tr>
</table>
</ItemTemplate>
</asp:DataList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="Data Source=SMARTSOFT;Initial Catalog=testdb;User ID=sa;password=;"
SelectCommand="SELECT top 10 * FROM test"></asp:SqlDataSource>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server">
</asp:ObjectDataSource>
<asp:DataList runat="server" ID="DataList2" BorderWidth="0" BorderColor="Red" DataSourceID="SqlDataSource1" RepeatColumns="2">
<ItemTemplate>
<table>
<tr>
<td>
<asp:Image ID="imagedata" runat="server" Width="65" Height="92" ImageUrl='<%# "~/Default.aspx?id=" + DataBinder.Eval(Container.DataItem,"[\"ImageID\"]").ToString() %>'/>
</td>
<td width="120" height="92">
<b>A:</b><asp:Label ID="Label2" runat="server" Text='<%# Eval("ImageDescription") %>'></asp:Label><br />
</td>
</tr>
</table>
</ItemTemplate>
</asp:DataList>
<asp:SqlDataSource ID="SqlDataSource1" runat="server" ConnectionString="Data Source=SMARTSOFT;Initial Catalog=testdb;User ID=sa;password=;"
SelectCommand="SELECT top 10 * FROM test"></asp:SqlDataSource>
<asp:ObjectDataSource ID="ObjectDataSource1" runat="server">
</asp:ObjectDataSource>
解决方案 »
- 【醒目标题】TreeView排序问题
- 问一个简单的问题
- 表单控件遍历(基类方法)求教
- 我需要MagicAjax.dll for vs2005急用,国外网站都打不开
- 新人请教!!!用Request.Params怎么在两个页面间传控件中的内容?
- 怎么读取径存到数据库中视频的路径赋值给网页中的播放器?
- 求文字转成html页的代码~~~
- 静态变量和多个线程问题?
- 设置authentication mode="Forms"后如何设置某类文件跳过验证
- vs.net中怎样得到其他得事件?
- 关于TreeView的问题,
- 请问,在.net Framework 2.0下开发出来的ASP.NET网站,要浏览必须用IE6 SP1,是吗?
Dim myPageUrl As String
Dim myPageNums As Integer '当前页码
Dim myTotalRecord As Integer '总记录数
Dim objTmp As New PagedDataSource '实例化一个分页数据源
Dim myDv As New DataView(tmpTable) '实例化一个排序数据视图
myDv.Sort = tmpSortRule '定义排序规则
objTmp.DataSource = myDv '赋值
objTmp.AllowPaging = True '允许分页
objTmp.PageSize = myPageSize '传递每页记录数
myTotalRecord = objTmp.DataSourceCount '取得当前分页数据源中的总记录数
ImgsCount = myTotalRecord
myPageNums = Request("Page")
If myPageNums = vbNullString OrElse IsNumeric(myPageNums) = False Then
myPageNums = 1
Else
myPageNums = Convert.ToInt32(myPageNums)
End If
objTmp.CurrentPageIndex = myPageNums - 1
myPageUrl = Request.CurrentExecutionFilePath
PageStr.Text = PageString(myPageSize, myTotalRecord, myPageNums, myPageUrl, "&obj=" & Request("obj")) ImgList.DataSource = objTmp
ImgList.DataBind()
ImgList.DataKeyField = "Name"
End Sub
Function PageString(ByVal tmpPageSize As Integer, ByVal tmpTotalRecord As Integer, ByVal tmpPageNums As Integer, ByVal tmpPageUrl As String, ByVal Other As String) As String
Dim myStr As String
Dim TotalPage As Integer
Dim i As Integer
Dim Tmp As String
If tmpTotalRecord = 0 Then Exit Function
If tmpTotalRecord Mod tmpPageSize > 0 Then
TotalPage = Fix(tmpTotalRecord / myPageSize) + 1
Else
TotalPage = tmpTotalRecord / myPageSize
End If
myStr += "共 " & tmpTotalRecord & " 个文件 共 " & FormatNumber(TotalSize / 1024, 2, -1) & " K 每页 " & tmpPageSize & " 个文件 当前 " & tmpPageNums & "/" & TotalPage & " 页 "
If Not tmpPageNums = 1 Then
myStr += "[<a href=" & tmpPageUrl & "?Page=1" & Other & ">第一页</a>][<a href=" & tmpPageUrl & "?Page=" & Convert.ToString(tmpPageNums - 1) & Other & ">上一页</a>]"
End If
If Not tmpPageNums = TotalPage Then
myStr += "[<a href=" & tmpPageUrl & "?Page=" & Convert.ToString(tmpPageNums + 1) & Other & ">下一页</a>][<a href=" & tmpPageUrl & "?Page=" & TotalPage & Other & ">最后页</a>]"
End If
Return myStr
End Function
我见过的有三种:
SQL存储过程。viewstate,PagedDataSource控件。
下面贴上第三种分页方法。我封装成了一个类
//分页绑定
public void ListBind(DataList Mylist,LinkButton up,LinkButton down,Label curpage,ref Label pagecount)
{
Connection.Close();
int Curpage = Convert.ToInt32(curpage.Text);
Connection.Open();
string Sql = "select * from book order by posttime desc";
OleDbDataAdapter Ada = new OleDbDataAdapter(Sql, Connection);
DataSet Myset = new DataSet();
Ada.Fill(Myset,"table");
PagedDataSource PgSource = new PagedDataSource();
PgSource.DataSource = Myset.Tables["table"].DefaultView;
PgSource.AllowPaging = true;
PgSource.PageSize = 3;
PgSource.CurrentPageIndex = Curpage - 1;
pagecount.Text = Convert.ToString(PgSource.PageCount);
up.Enabled = true;
down.Enabled = true;
if (Curpage==1)
{
up.Enabled = false;
}
if (Curpage == PgSource.PageCount)
{
down.Enabled = false;
}
Mylist.DataSource = PgSource;
Mylist.DataBind();
Connection.Close();
}
http://donet.it.com.cn/articles/90464.htm2、使用PagedDataSource类实现
http://rainic.5151j.com.cn/article_view.asp?type=2&id=657
CREATE proc cutpage_record
@RecordCount int output, --返回总记录数
@QueryStr nvarchar(100),--表名、视图名、查询语句
@PageSize int, --每页的大小(行数)
@PageCurrent int, --要显示的页
@FdShow nvarchar (1000), --要显示的字段列表
@WhereStr nvarchar (4000),
@FdOrder nvarchar(100), --排序
@PageCount int output --返回总页数
as
declare
@sql nvarchar(4000)
set @sql = ''
if @WhereStr = '' begin
set @WhereStr = '1=1'
end
if @FdShow = '' begin
set @FdShow = '*'
enddeclare @tsql nvarchar (200)set @tsql=N'select @RecordCount = count(*) from ' + @QueryStr + ' where ' + @WhereStr
exec sp_executesql @tsql,N'@RecordCount int output',@RecordCount output
set @pageCount=ceiling(@recordCount*1.0/@pageSize)
if @PageCurrent = 1 begin
set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr +' order by ' + @FdOrder + ' desc'
end
else begin
set @sql = 'select top ' + cast(@PageSize as nvarchar(3)) + ' ' + @FdShow + ' from ' + @QueryStr + ' where ' + @WhereStr + ' and ' + @FdOrder + '< ( select min(' + @FdOrder + ') from (select top ' + cast(@PageSize*(@PageCurrent-1) as nvarchar(10)) + ' ' + @FdOrder + ' from ' + @QueryStr + ' where ' + @WhereStr + ' order by ' + @FdOrder + ' desc'+ ') as t) order by ' + @FdOrder +' desc'
end
--print @sql
execute(@sql)
GOASP.NET部分代码:
private void Page_Load(object sender, System.EventArgs e)
{
//页面初始化,显示第一页,并将当前页存在一个隐藏控件里
if (!(Page.IsPostBack))
{
Hidden3.Value="1";
GridBind(1);
}
} public void GridBind(int c_page) //绑定DataList,参数:当前页
{
string strsql= GetStrsql(); //获取查询条件,无'WHERE'
DataList1.DataSource=LoadDB(strsql,c_page);
DataList1.DataBind();
}
/// 分页显示程序
/// <param name="mysql">数据库连接字符串</param>
/// <param name="tablename">查询用的表名</param>
/// <param name="pagesize">每页显示的记录数</param>
/// <param name="currentpage">要显示的页数</param>
/// <param name="where">查询的条件</param>
/// <param name="columnorder">排序的列</param>
/// <returns>返回总记录数</returns>
/// <returns>返回总页数</returns>
public DataSet DsCutPage(string mysql,string tablename,int pagesize,int currentpage,string where,string columnorder,out double recordCount,out double pageCount)
{
SqlConnection sqlConn_R=new SqlConnection(mysql); SqlCommand cmd = new SqlCommand("cutpage_record",sqlConn_R);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter p7 = cmd.Parameters.Add("@RecordCount",SqlDbType.Int);
p7.Direction = ParameterDirection.Output; SqlParameter p8 = cmd.Parameters.Add("@pageCount",SqlDbType.Int);
p8.Direction = ParameterDirection.Output; SqlParameter p = cmd.Parameters.Add("@QueryStr",SqlDbType.NVarChar,100);
p.Value = tablename; SqlParameter p1 = cmd.Parameters.Add("@PageSize",SqlDbType.Int);
p1.Value = pagesize; SqlParameter p2 = cmd.Parameters.Add("@PageCurrent",SqlDbType.Int);
p2.Value = currentpage; SqlParameter p3 = cmd.Parameters.Add("@FdShow",SqlDbType.NVarChar,1000);
p3.Value = "*"; SqlParameter p5 = cmd.Parameters.Add("@WhereStr",SqlDbType.NVarChar,4000);
p5.Value = where; SqlParameter p6 = cmd.Parameters.Add("@FdOrder",SqlDbType.NVarChar,100);
p6.Value = columnorder; DataSet ds = new DataSet();
SqlDataAdapter da = new SqlDataAdapter();
da.SelectCommand = cmd; da.Fill(ds); recordCount = double.Parse(da.SelectCommand.Parameters["@RecordCount"].Value.ToString());
pageCount = double.Parse(da.SelectCommand.Parameters["@PageCount"].Value.ToString()); return ds;
} private DataSet LoadDB(string strSQL,int cruu_page) //从数据库读入数据到DateSet,参数strSQL为查询用的SQL语句,参数cruu_page为当前页
{
string strConnection = ConfigurationSettings.AppSettings["connstring"];
double row_coun,page_coun;
DataSet ds=DsCutPage(strConnection,"MyDataBase",15,cruu_page,strSQL,"id",out row_coun,out page_coun);
string a=row_coun.ToString()+","+page_coun.ToString();
Hidden2.Value=a; //将总记录数和总页数存在隐藏控件中
return ds;
}
private void DataList1_ItemCommand(object source, System.Web.UI.WebControls.DataListCommandEventArgs e)
{
//在DataList的<FooterTemplate>中定义了控制跳转的按钮,附后~
switch (e.CommandName)
{
case "ch_page": //页面跳转
cur_page=Convert.ToInt16(Hidden3.Value.Trim());
int intPageCruu=cur_page;
string b=Hidden2.Value;
string[] arrya=b.Split(',');
int intPageCoun=Convert.ToInt16(arrya[1].Trim());
switch (e.CommandArgument.ToString())
{
case "next":
cur_page=Math.Min(intPageCruu + 1, intPageCoun);
break;
case "prev":
cur_page=Math.Max(intPageCruu -1, 1);
break;
case "last":
cur_page=intPageCoun;
break;
default:
cur_page=1;
break;
}
Hidden3.Value=cur_page.ToString();
DataList1.SelectedIndex = -1;
GridBind(cur_page);
break;
default:
break;
}
private void DataList1_ItemDataBound(object sender, System.Web.UI.WebControls.DataListItemEventArgs e)
{
if(e.Item.ItemType==ListItemType.Footer)
{
string b=Hidden2.Value; //获得总记录数和页数
string c=Hidden3.Value; //获得当前页
string[] arrya=b.Split(',');
HtmlGenericControl a=new HtmlGenericControl();
a=(HtmlGenericControl)e.Item.FindControl("r_coun");
a.InnerText=arrya[0];
a=(HtmlGenericControl)e.Item.FindControl("p_coun");
a.InnerText=arrya[1];
a=(HtmlGenericControl)e.Item.FindControl("p_cuur");
a.InnerText=c;
}
}ASP.NET页面DataList的部分:
<FooterTemplate>
<TABLE cellSpacing="0" cellPadding="5" width="742" border="0">
<tr>
<td width="470">总共 <label id="p_coun" runat="server" /> 页,记录 <label id="r_coun" runat="server" /> 条 第
<label id="p_cuur" runat="server" /> 页
<asp:linkbutton id="btnFirst" CommandName="ch_page" runat="server" CommandArgument="0" ForeColor="navy"
Font-size="8pt" Font-Name="verdana">首页</asp:linkbutton>
<asp:linkbutton id="btnPrev" CommandName="ch_page" runat="server" CommandArgument="prev" ForeColor="navy"
Font-size="8pt" Font-Name="verdana">前一页</asp:linkbutton>
<asp:linkbutton id="btnNext" CommandName="ch_page" runat="server" CommandArgument="next" ForeColor="navy"
Font-size="8pt" Font-Name="verdana">后一页</asp:linkbutton>
<asp:linkbutton id="btnLast" CommandName="ch_page" runat="server" CommandArgument="last" ForeColor="navy"
Font-size="8pt" Font-Name="verdana">尾页</asp:linkbutton>
</td>
<td width="170"><font color="#990000">提示:点击图片按钮进行操作</font></td>
</tr>
</TABLE>
</FooterTemplate>基本的意思应该可以看出来了.......
你自己再整理一下~
string strsql= GetStrsql(); //获取查询条件,无'WHERE'
改为:
string strsql= "id<>0"; //或者其他的一个简单查询条件....
PagedDataSource objpage;
const string url = "News.aspx";
private void BindData()
{
string sql = "select * from News order by ID asc";
OleDbDataAdapter da = new OleDbDataAdapter(sql, cn);
DataSet ds = new DataSet();
da.Fill(ds, "TB");
//分页开始
objpage = new PagedDataSource();
objpage.DataSource = ds.Tables["TB"].DefaultView;
objpage.AllowPaging = true;
objpage.PageSize = 20;
int curpage;
if (Request.QueryString["Page"] != null)
curpage = Convert.ToInt32(Request.QueryString["Page"]);
else
curpage = 1;
objpage.CurrentPageIndex = curpage - 1;
if (objpage.IsFirstPage && !objpage.IsLastPage)
{
this.hlProv.Enabled = false;
this.hlNext.NavigateUrl = url + "?page=" + Convert.ToInt32(curpage + 1);
this.hlFirst.Enabled = false;
this.hlLast.NavigateUrl = url + "?page=" + Convert.ToInt32(objpage.PageCount);
}
else
{
if (objpage.IsLastPage && !objpage.IsFirstPage)
{
this.hlFirst.NavigateUrl = url + "?page=" + 1;
this.hlLast.Enabled = false;
this.hlNext.Enabled = false;
this.hlProv.NavigateUrl = url + "?page=" + Convert.ToInt32(curpage - 1);
}
else
{
if (objpage.IsFirstPage && objpage.IsLastPage)
{
this.hlLast.Enabled = false;
this.hlNext.Enabled = false;
this.hlProv.Enabled = false;
this.hlFirst.Enabled = false;
}
else
{
this.hlFirst.NavigateUrl = url + "?page=" + 1;
this.hlLast.NavigateUrl = url + "?page=" + Convert.ToInt32(objpage.PageCount);
this.hlNext.NavigateUrl = url + "?page=" + Convert.ToInt32(curpage + 1);
this.hlProv.NavigateUrl = url + "?page=" + Convert.ToInt32(curpage - 1);
}
}
}
//
this.DataList2.DataSource = objpage;
this.DataList2.DataBind();
//
this.lblcur.Text = Convert.ToInt32(objpage.CurrentPageIndex + 1).ToString();
this.lblPageCount.Text = objpage.PageCount.ToString();
this.lblCount.Text = ds.Tables["TB"].Rows.Count.ToString();
this.tbPageIndex.Text = Convert.ToString((objpage.CurrentPageIndex + 1));
cn.Close();
}
另外,你的“下一页”的代码呢?
删除 DataSourceID="SqlDataSource1"
删除 <asp:SqlDataSource ...>在 </ItemTemplate> 之间插入以下代码 </asp:DataList> <FooterTemplate>
<TABLE cellSpacing="0" cellPadding="5" width="742" border="0">
<tr>
<td width="470">总共 <label id="p_coun" runat="server" /> 页,记录 <label id="r_coun" runat="server" /> 条 第
<label id="p_cuur" runat="server" /> 页
<asp:linkbutton id="btnFirst" CommandName="ch_page" runat="server" CommandArgument="0" ForeColor="navy"
Font-size="8pt" Font-Name="verdana">首页</asp:linkbutton>
<asp:linkbutton id="btnPrev" CommandName="ch_page" runat="server" CommandArgument="prev" ForeColor="navy"
Font-size="8pt" Font-Name="verdana">前一页</asp:linkbutton>
<asp:linkbutton id="btnNext" CommandName="ch_page" runat="server" CommandArgument="next" ForeColor="navy"
Font-size="8pt" Font-Name="verdana">后一页</asp:linkbutton>
<asp:linkbutton id="btnLast" CommandName="ch_page" runat="server" CommandArgument="last" ForeColor="navy"
Font-size="8pt" Font-Name="verdana">尾页</asp:linkbutton>
</td>
<td width="170"><font color="#990000">提示:点击图片按钮进行操作</font></td>
</tr>
</TABLE>
</FooterTemplate>数据库操作的代码稍微改一下,
1、改成你的表名‘test’;
2、表的关键字段有吗?取代代码中的‘id’;
3、string strConnection = ConfigurationSettings.AppSettings["connstring"];改成你的数据库连接语句...
Compiler Error Message: CS0103: The name 'Hidden3' does not exist in the current contextSource Error: Line 55: if (!(Page.IsPostBack))
Line 56: {
Line 57: Hidden3.Value = "1";
Line 58: GridBind(1);
Line 59: }
Source File: e:\Project\Code\Alibooks\Default.aspx.cs Line: 57
/////第二次报错(发生在我注释上面一行代码之后)Compiler Error Message: CS0103: The name 'cur_page' does not exist in the current contextSource Error: Line 134: {
Line 135: case "ch_page": //页面跳转
Line 136: cur_page = Convert.ToInt16(Hidden3.Value.Trim());
Line 137: int intPageCruu = cur_page;
Line 138: string b = Hidden2.Value;
Source File: e:\Project\Code\Alibooks\Default.aspx.cs Line: 136 你的隐藏控件是怎么申请有的啊?能加我的QQ:332998001吗?我头都快大了!
孟老大上面有不少例子,可以看看
请问这段代码this.hlNext.NavigateUrl = url + "?page=" + Convert.ToInt32(curpage + 1);
为何用 url ???
不用 Request.CurrentExecutionFilePath 呀!!
请赐教!!!!
在线等
我将万分感激请问这段代码this.hlNext.NavigateUrl = url + "?page=" + Convert.ToInt32(curpage + 1);
为何用 url ???
不用 Request.CurrentExecutionFilePath 呀!!
请赐教!!!!
这里用的是一个控件,LZ可去找到,原理用它在当前地址栏里传递分页号码,然后取出来使用如下:
curpage = Convert.ToInt32(Request.QueryString["Page"]);
LZ细分下,就会明白了.
用存储过分页,那可是很牛的,呵呵!
aspnetpage asp.net2.0上好用吗?