c#中DataGridview 怎么实现分页

feiyun1102 2009-11-25 09:54:41
各位学长们,帮帮我啊,我先在DataGridView,绑定数据库数据,然后想让他每页显示10页,进行分页。按上一页,下一页,首页,末页。
...全文
5095 37 打赏 收藏 转发到动态 举报
写回复
用AI写文章
37 条回复
切换为时间正序
请发表友善的回复…
发表回复
yyclee 2011-09-05
  • 打赏
  • 举报
回复
ok,看分页为了什么,最好是存储过程。
jdldl 2010-12-21
  • 打赏
  • 举报
回复
如果用 mssql 则可以用存储过程

CREATE procedure wz_sqlpager
@sqlstr nvarchar(4000)="", --查询字符串
@currentpage int=0, --第N页
@pagesize int=0 , --每页行数
@count int output --总行数
---@rowcount as 总行数,@currentpage as 当前页
as
set nocount on
declare @P1 int, --P1是游标的id
@rowcount int
exec sp_cursoropen @P1 output,@sqlstr,@scrollopt=1,@ccopt=1, @rowcount=@rowcount output
set @count= ceiling(1.0*@rowcount/@pagesize)
set @currentpage=(@currentpage-1)*@pagesize+1
exec sp_cursorfetch @P1,16,@currentpage,@pagesize
exec sp_cursorclose @P1
set nocount off
GO


用 c# 程序进行分页显示:

SqlCommand sqlcomm = new SqlCommand("wz_sqlpager", sqlconn0);
sqlcomm.CommandType = CommandType.StoredProcedure;
SqlParameter[] Parameters = new SqlParameter[4];
Parameters[0] = new SqlParameter("@sqlstr", SqlDbType.NVarChar);
Parameters[0].Value = sqltxt; // sql 查询命令
Parameters[1] = new SqlParameter("@currentpage", SqlDbType.Int);
Parameters[1].Value = u_hh; //需要显示的行号
Parameters[2] = new SqlParameter("@pagesize", SqlDbType.Int);
Parameters[2].Value = 10; // 每页的行数
Parameters[3] = new SqlParameter("@count", SqlDbType.Int);
Parameters[3].Direction = ParameterDirection.Output;
Parameters[3].Value = 0; // 总行数
sqlcomm.Parameters.AddRange(Parameters);

if (Tables.Tables.Count != 0)
{
if (Tables.Tables[1].Rows.Count!= 0)
Tables.Tables[1].Clear();
}
tableAdapter.SelectCommand = sqlcomm;
tableAdapter.Fill(Tables);




如果用 datagridview 显示结果,则datagridview 窗口显示行数:

// hs 行数

datagridview.Rows.Add(1);
hs= (datagridview.DisplayRectangle.Height - datagridview.ColumnHeadersHeight )/ datagridview.Rows[0].Height;
datagridview.Rows.RemoveAt(0);


wangtaiping 2010-10-27
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 peixuebing 的回复:]
15楼的sql语句是个垃圾分页
[/Quote]
哥 你能不能厚道点。。。
ybfqzm 2010-07-26
  • 打赏
  • 举报
回复


直接都可以设置。
这种使用方法是在,数据量小的情况下!
qq652070502 2010-07-26
  • 打赏
  • 举报
回复
good!
sunlu1987 2010-07-26
  • 打赏
  • 举报
回复
Mark,学习一下
无所依赖 2010-07-23
  • 打赏
  • 举报
回复
学习来了
kucao0707 2010-07-23
  • 打赏
  • 举报
回复
1楼的代码太多冗余了
richgong 2010-07-23
  • 打赏
  • 举报
回复
學習一下.
冰凝瞬间1986 2010-07-22
  • 打赏
  • 举报
回复
如果你数据库有默认的系统数据库,建立一个CS类文件,拷贝进去,直接运行就可以了
冰凝瞬间1986 2010-07-22
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;
using System.Data.SqlClient;

//Winform datagridview 大数量查询分页显示 微软的解决办法
namespace WindowsApplication1
{
public partial class Form1 : Form
{
// WinForm上的控件
Button prevBtn = new Button();
Button nextBtn = new Button();
Button firstBtn = new Button();
Button lastBtn = new Button();
static DataGrid myGrid = new DataGrid();
static Label pageLbl = new Label();
// 分页的变量
static int pageSize = 4; // 每页显示多少
static int leftpageSiz; // 分页余数
static int totalPages = 0; // 总共页数
static int currentPage = 0; // 当前页数.
static string firstVisibleCustomer = ""; // First customer on page to determine location for move previous.
static string lastVisibleCustomer = ""; // Last customer on page to determine location for move next.
// DataSet to bind to DataGrid.
static DataTable custTable;
// Initialize connection to database and DataAdapter.
static SqlConnection nwindConn = new SqlConnection("Data Source=localhost;Integrated Security=SSPI;Initial Catalog=northwind");
static SqlDataAdapter custDA = new SqlDataAdapter("", nwindConn);
static SqlCommand selCmd = custDA.SelectCommand;

public Form1()
{
InitializeComponent();

// Initialize controls and add to form.
this.ClientSize = new Size(360, 274);
this.Text = "NorthWind Data";
myGrid.Size = new System.Drawing.Size(729, 240);
myGrid.Dock = System.Windows.Forms.DockStyle.Top;
myGrid.AllowSorting = true;
myGrid.CaptionText = "NorthWind Customers";
myGrid.ReadOnly = true;
myGrid.AllowNavigation = false;
myGrid.PreferredColumnWidth = 150;

firstBtn.Text = "First";
firstBtn.Size = new Size(48, 24);
firstBtn.Location = new Point(22, 240);
firstBtn.Click += new EventHandler(First_OnClick);

prevBtn.Text = "Prev";
prevBtn.Size = new Size(48, 24);
prevBtn.Location = new Point(92, 240);
prevBtn.Click += new EventHandler(Prev_OnClick);

nextBtn.Text = "Next";
nextBtn.Size = new Size(48, 24);
nextBtn.Location = new Point(160, 240);
nextBtn.Click += new EventHandler(Next_OnClick);

lastBtn.Text = "Last";
lastBtn.Size = new Size(48, 24);
lastBtn.Location = new Point(230, 240);
lastBtn.Click += new EventHandler(Last_OnClick);


pageLbl.Text = "没有记录";
pageLbl.Size = new Size(130, 16);
pageLbl.Location = new Point(300, 244);
this.Controls.Add(myGrid);
this.Controls.Add(prevBtn);
this.Controls.Add(firstBtn);
this.Controls.Add(nextBtn);
this.Controls.Add(lastBtn);
this.Controls.Add(pageLbl);

// 获取第一页数据
GetData("Default");
DataView custDV = new DataView(custTable, "", "ID", DataViewRowState.CurrentRows);
myGrid.SetDataBinding(custDV, "");

}
public static void First_OnClick(object sender, EventArgs args)
{
GetData("First");
}
public static void Prev_OnClick(object sender, EventArgs args)
{
GetData("Previous");
}
public static void Next_OnClick(object sender, EventArgs args)
{
GetData("Next");
}
public static void Last_OnClick(object sender, EventArgs args)
{
GetData("Last");
}
private void Form1_Load(object sender, EventArgs e)
{

}
public static void GetData(string direction)
{
// Create SQL statement to return a page of records.
selCmd.Parameters.Clear();
switch (direction)
{
case "First":
selCmd.CommandText = "SELECT TOP " + pageSize + " * FROM Customers ";
break;

case "Next":
selCmd.CommandText = "SELECT TOP " + pageSize + " * FROM Customers " +
"WHERE ID > @ID ORDER BY ID";
selCmd.Parameters.Add("@ID", SqlDbType.VarChar, 5).Value = lastVisibleCustomer;
break;

case "Previous":
selCmd.CommandText = "SELECT TOP " + pageSize + " * FROM Customers " +
"WHERE ID < @ID ORDER BY ID DESC";
selCmd.Parameters.Add("@ID", SqlDbType.VarChar, 5).Value = firstVisibleCustomer;
break;

case "Last":
selCmd.CommandText = "SELECT TOP " + leftpageSiz + " * FROM Customers ORDER BY ID DESC";
break;

default:
selCmd.CommandText = "SELECT TOP " + pageSize + " * FROM Customers ORDER BY ID";

// Determine total pages.
SqlCommand totCMD = new SqlCommand("SELECT Count(*) FROM Customers", nwindConn);
nwindConn.Open();
int totalRecords = (int)totCMD.ExecuteScalar();
nwindConn.Close();
totalPages = (int)Math.Ceiling((double)totalRecords / pageSize);
if ((totalRecords % pageSize) == 0)
{
leftpageSiz = pageSize;
}
else
{
leftpageSiz = totalRecords % pageSize;
}
break;
}
// Fill a temporary table with query results.
DataTable tmpTable = new DataTable("Customers");
int recordsAffected = custDA.Fill(tmpTable);
// If table does not exist, create it.
if (custTable == null)
custTable = tmpTable.Clone();
// Refresh table if at least one record returned.
if (recordsAffected > 0)
{
switch (direction)
{
case "First":
currentPage = 1;
break;
case "Next":
currentPage++;
break;
case "Previous":
currentPage--;
break;
case "Last":
currentPage = totalPages;
break;
default:
currentPage = 1;
break;
}
pageLbl.Text = "Page " + currentPage + " of " + totalPages;
// Clear rows and add new results.
custTable.Rows.Clear();
foreach (DataRow myRow in tmpTable.Rows)
custTable.ImportRow(myRow);
// Preserve first and last primary key values.
DataRow[] ordRows = custTable.Select("", "ID ASC");
firstVisibleCustomer = ordRows[0][0].ToString();
lastVisibleCustomer = ordRows[custTable.Rows.Count - 1][0].ToString();
}
}

}
}
gohappy2008 2010-07-22
  • 打赏
  • 举报
回复
可以先写一个分页的存储过程,
然后实现起来就比较容易了。
mill_dhl 2010-07-22
  • 打赏
  • 举报
回复
mark
houyizhinv 2010-07-22
  • 打赏
  • 举报
回复
如果用的多 建议做一个DataGridView的自定义控件
我们以前也做过
增加一个每页显示多少行的属性DisplayRowCount
然后四个按钮的方法写进去
自由_ 2010-07-22
  • 打赏
  • 举报
回复
学习
有用
收下
peixuebing 2010-07-22
  • 打赏
  • 举报
回复
15楼的sql语句是个垃圾分页
一克代码 2010-05-24
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 wjs496249880 的回复:]
C# code

using System;
using System.Data;
using System.Configuration;
using System.Collections;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebContro……
[/Quote]


up 1楼牛!!
wxm3630478 2010-05-24
  • 打赏
  • 举报
回复
真分页还是假分页哟

真分页要写SQL语句控制的,假分页把所有数据先查询出来,只是一页一页的显示,这个简单
mazheng910924 2010-05-24
  • 打赏
  • 举报
回复
web里面DataGridView自带的分页 Winfrom里面需要自己写
水哥阿乐 2010-05-22
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 lcl_data 的回复:]
DataGridView
有一个属性的,设置一下就不用像一楼那么多代码了..
那个属性的名字你一看就明白他的意思了
[/Quote]
那个属性,难道还能分页
加载更多回复(17)

110,476

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧