这样搞定:
================================================ this.print = true;
this.ppea  = e; //自动获取打印纸的宽和高
//this.paperWidth.Text  = e.PageBounds.Width.ToString();
//this.paperHeight.Text = e.PageBounds.Height.ToString(); //this.DisplayToPrint(); //this.ReadData(e.Graphics); // ---------------------------------------------------------------------------------
//复制dstaset
if(printDS.Tables.Count <=0){
printDS = this._ds.Copy();
}

//顶点坐标
Point startPoint = new Point(0,0);
int pageWidth    = this.sc.paperWidth; //循环用
int i = 1;
int n = 1; //列距
int space = this.sc.colSpace; //起点坐标值
int x = this.sc.leftMar;
int y = this.sc.topMar;
startPoint = new Point(x,y); //每页打印卡片数
int totalCount = this.sc.rowNum * this.sc.colNum; //如果数据不为空,则继续打印
if(this.printDS != null && this.printDS.Tables.Count > 0 && this.printDS.Tables[0].Rows.Count > 0){ int j;
for(j=0;j<this.printDS.Tables[0].Rows.Count && n <= totalCount;j++){ DataRow row = this.printDS.Tables[0].Rows[j]; //照片
byte[] photoArr = (byte[])(row["photo"]);
Image img = null;
if(photoArr.Length > 5){
img = Image.FromStream(new MemoryStream(photoArr));
img = img.GetThumbnailImage(Int32.Parse(this.sc.PHOTO_WIDTH), Int32.Parse(this.sc.PHOTO_HEIGHT), null, IntPtr.Zero);
} //绘制一张卡号
this.DrawPhoto(e.Graphics,img,row["schoolName"].ToString(),row["name"].ToString(),row["sid"].ToString(),space,startPoint,row["lid"].ToString()); //自增
i ++;
n ++; //计算移动分量
if(i > this.sc.rowNum){
i = 1;
x = this.sc.leftMar;
y = y + Int32.Parse(this.sc.PRINT_HEIGHT) + this.sc.rowSpace;
startPoint = new Point(x,y);
}else{
x = x + Int32.Parse(this.sc.PRINT_WIDTH)  + this.sc.colSpace;
startPoint = new Point(x,y);
} //去掉已打印的
this.printDS.Tables[0].Rows.RemoveAt(j);
j --;
} if(this.printDS.Tables[0].Rows.Count > 0){
e.HasMorePages = true;
//MessageBox.Show(this.printDS.Tables[0].Rows.Count.ToString());
}else{
e.HasMorePages = false;
}
} this.print = false;