打印Table分页问题

liangzhl 2010-04-21 03:09:20
我在开始的时候声明了一个公共的DataTable dt=New DataTable();

然后里面我也加入了许多条数据(不固定)

现在我要打印这个dt里面的数据

比如我一页只要打印10条数据,那么如果dt里面的数据多于10条,我就得

分页,从下一页在开始打印了

我现在的代码是
//打印
int index = 0;
int j = 0, i = 0;

private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
{
int hj = 30;
int linesPerPage = 10;

if (dt.Rows.Count-index < linesPerPage)
linesPerPage = dt.Rows.Count - index;
else
linesPerPage = 10;

for (i = j; i < linesPerPage + j; i++)
{
//这里是我要打印的格式,自己写的
index += 1;
hj += 110;
}
if (index < dt.Rows.Count)
{
j = index;
e.HasMorePages = true;
}
else
e.HasMorePages = false;

为什么总是只打印一页出来,而已啊?
...全文
487 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
liangzhl 2010-04-22
  • 打赏
  • 举报
回复
求助....................高手
yantian001 2010-04-21
  • 打赏
  • 举报
回复
mark
lester19872007 2010-04-21
  • 打赏
  • 举报
回复
要通用也只能说数据库的分页可以通用!
lester19872007 2010-04-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 jason_dct 的回复:]
sorry 我的第三方工具
----参考一下其他的吧
http://www.soaspx.com/dotnet/asp.net/tech/tech_20091218_2112.html
[/Quote]

你是这ASP.NET的,楼主的是winform的程序,完全不是一个类型的,如果是asp.net我这里有现成的!
段传涛 2010-04-21
  • 打赏
  • 举报
回复
sorry 我的第三方工具
----参考一下其他的吧
http://www.soaspx.com/dotnet/asp.net/tech/tech_20091218_2112.html
段传涛 2010-04-21
  • 打赏
  • 举报
回复
先帮你定 。我看我的代码
lester19872007 2010-04-21
  • 打赏
  • 举报
回复
这是你的第三贴了!!!!
你的这个方法,打印DGV的既然可以分页成功,那么你可以把你的这个TABLE 绑定到DGV里面在打印,以后代码多加点注释啊,我看得还头疼啊!!
wedy_wang 2010-04-21
  • 打赏
  • 举报
回复
你将button1_Click当中的PrintDialog改成PrintPreviewDialog类型,就可以看到打印了3页,table里面有30行,根据的你的需要,每页只打印10行,因此会有三页,没有重叠现象。请笑纳,希望对你有帮助。
wedy_wang 2010-04-21
  • 打赏
  • 举报
回复
你试试这个,我写的一个简单的。

private PrintDocument doc = new PrintDocument();
private DataTable table;
private int hasPrintedRowCount;//保存已经打印了多少页

private void Form1_Load(object sender, EventArgs e)
{
doc.BeginPrint += new PrintEventHandler(doc_BeginPrint);
doc.PrintPage += new PrintPageEventHandler(doc_PrintPage);
}

void doc_PrintPage(object sender, PrintPageEventArgs e)
{
int currentPageMaxCount = 10;
if (table.Rows.Count < currentPageMaxCount)
{
currentPageMaxCount = table.Rows.Count;
}

Matrix oldTransform = e.Graphics.Transform;

int baseIndex = hasPrintedRowCount;

for (int i = 0; i < currentPageMaxCount; i++)
{
e.Graphics.DrawString(table.Rows[i + baseIndex]["col1"].ToString(), this.Font, Brushes.Red, e.MarginBounds.X, e.MarginBounds.Y);
e.Graphics.TranslateTransform(0, 20);//移动RenderOrigin,保证垂直方向往下面移动20个像素,也就是每行20像素高。
hasPrintedRowCount++;
}


e.Graphics.Transform = oldTransform;
oldTransform.Dispose();

if (hasPrintedRowCount < table.Rows.Count)
{
e.HasMorePages = true;
}
else
{
e.HasMorePages = false;
}
}

void doc_BeginPrint(object sender, PrintEventArgs e)
{
table = GetTable();
}

DataTable GetTable()
{
DataTable table = new DataTable();
table.Columns.Add(new DataColumn("col1"));

for (int i = 0; i < 30; i++)
{
DataRow r = table.NewRow();
r["col1"] = i;
table.Rows.Add(r);
}

return table;
}

private void button1_Click(object sender, EventArgs e)
{
hasPrintedRowCount = 0;
PrintDialog dia = new PrintDialog();
dia.Document = doc;
dia.ShowDialog(this);
}
liangzhl 2010-04-21
  • 打赏
  • 举报
回复
急..............................
liangzhl 2010-04-21
  • 打赏
  • 举报
回复
dataGridView的我可以实现分页的,可是就是到这个DataTable的,
我就和DGV一样的来分页就不行了,郁闷啊.....................
taikonhmao67 2010-04-21
  • 打赏
  • 举报
回复
上边的是我的代码 你参考下吧
taikonhmao67 2010-04-21
  • 打赏
  • 举报
回复

int yulan = 0;
int yushu = 1;
int shuliang ;
int countPage = 0;


{
int fltLines = 0;//一页中的行数
fltLines =30;
int nCount=0;


if (yulan == countPage*yushu)
{


if (curline > yulan * fltLines)
{
curline = 0;
}
shuliang = 0;
}

if (dataGridView1.DataBindings != null)
{
for (int m = 0; m < countPage; m++)
{


if ((curline + nCount > dataGridView1.Rows.Count * yushu))
{

break;

}
yulan++;
nCount = 0;
int rowcount = shuliang * fltLines;
int[] columnsWidth = new int[dataGridView1.Columns.Count];
//C#打印控件的使用之得到所有列的个数
int[] columnsLeft = new int[dataGridView1.Columns.Count];
for (int c = 0; c < columnsWidth.Length; c++)
//C#打印控件的使用之得到列标题的宽度
{

if (dataGridView1.Columns[c].HeaderText.Length == 2 && dataGridView1.Columns[c].HeaderText != "姓名")
{
columnsWidth[c] = ((int)e.Graphics.MeasureString(dataGridView1.Columns[c].HeaderText, tabelTextFont).Width - 30);
}
else
{
columnsWidth[c] = ((int)e.Graphics.MeasureString(dataGridView1.Columns[c].HeaderText, tabelTextFont).Width - 20);

}
}
for (int rowIndex = 0; rowIndex < dataGridView1.Rows.Count; rowIndex++) //C#打印控件的使用之rowindex当前行
{
for (int columnIndex = 0; columnIndex < dataGridView1.Columns.Count; columnIndex++)
//C#打印控件的使用之当前列
{
if (dataGridView1.Columns[columnIndex].HeaderText.Length == 2 && dataGridView1.Columns[columnIndex].HeaderText != "姓名")
{

int w = (int)e.Graphics.MeasureString(dataGridView1.Columns[columnIndex].Name, tabelTextFont).Width - 30;
columnsWidth[columnIndex] = w < columnsWidth[columnIndex] ? w : columnsWidth[columnIndex];
}
else
{
int w = (int)e.Graphics.MeasureString(dataGridView1.Columns[columnIndex].Name, tabelTextFont).Width - 20;
columnsWidth[columnIndex] = w < columnsWidth[columnIndex] ? w : columnsWidth[columnIndex];
}
}
}//C#打印控件的使用
int rowHidth = 33;
int tableLeft;
if (ZengJia)
{
tableLeft = 40;
}
else
{
tableLeft = 60;
}
int tableTop = 70;
columnsLeft[0] = tableLeft;
for (int i = 1; i <= columnsWidth.Length - 1; i++)
{
columnsLeft[i] = columnsLeft[i - 1] + columnsWidth[i - 1] + 15;
}
StringFormat sf = new StringFormat();
sf.Alignment = StringAlignment.Center;//居中打印
e.Graphics.DrawString(Title, new Font("宋体", 15), Brushes.Black, new Point(e.PageBounds.Width / 2, 20), sf);



//打印标题
for (int c = 0; c < columnsWidth.Length; c++) //打印表中的列名
{
... }//C#打印控件的使用

for (int rowIndex = rowcount; rowIndex < dataGridView1.Rows.Count; rowIndex++)//打印表中的内容
{


for (int columnIndex = 0; columnIndex < dataGridView1.Columns.Count; columnIndex++)
{
if (dataGridView1.Columns[columnIndex].Name == "shenfen")
{
... if (va[0] == '*' && va[va.Length - 1] == '*')
{//
... }
else
{
...


}
}
else
{
tabelTextFont = new Font("宋体", 12);
}

...
}

nCount++;
if (rowIndex==dataGridView1.Rows.Count-1)
{
...
}

if (nCount == fltLines)
{
shuliang++;

...
break;
}
}

curline += nCount;
if (yulan == countPage+1)
yushu++;

//如果味道大文件的末尾,继续打印

if (curline < dataGridView1.Rows.Count*yushu)
{
e.HasMorePages = true;
return;
}
else
{
e.HasMorePages = false;

}


}
}
//C#打印控件的使用之

}

taikonhmao67 2010-04-21
  • 打赏
  • 举报
回复
你的这个问题和我以前的一样 我就是加了 return 后 分页就正确了 你看一下 是不是你的 判断语句有问题 但不跟踪下
liangzhl 2010-04-21
  • 打赏
  • 举报
回复
没用,还是没分页啊,打印预览看到的是这样的

上面三部分都重叠到一起去了,而不是在第二页显示



就是说没分页,怎么办啊
taikonhmao67 2010-04-21
  • 打赏
  • 举报
回复
if (index < dt.Rows.Count)
{
j = index;
e.HasMorePages = true;
}
else

改成

if (index < dt.Rows.Count)
{
j = index;
e.HasMorePages = true;
return;

}
else
liangzhl 2010-04-21
  • 打赏
  • 举报
回复
怎么没人回啊,,,,可以实现的话在加分了............

110,536

社区成员

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

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

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