Я работаю над печатью чеков с использованием C # и WinForms. Проблема заключается в том, что после нажатия кнопки печати он печатает только первый элемент в представлении таблицы данных и половину второго элемента, например:

Вот код, который я использую:
private void btnSave_Click(object sender, EventArgs e)
{
for (int i = 0; i<dataGridView1.Rows.Count; i++ )
{
OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=TS-POS.accdb");
OleDbCommand cmd = new OleDbCommand("INSERT INTO Sales (InvoiceNo,InvoiceDate, Pname, Pprice, Bcode, Staff) VALUES ('" + txtInvoiceNo.Text + "','" + dateTimePicker1.Value + "', '" + dataGridView1.Rows[i].Cells[1].Value + "', '" + dataGridView1.Rows[i].Cells[3].Value + "', '" + dataGridView1.Rows[i].Cells[0].Value + "', '" + lblUser.Text + "')", conn);
// cmd.Parameters.AddWithValue("@staff", OleDbType.VarChar).Value = lblUser.Text;
conn.Open();
cmd.ExecuteNonQuery();
conn.Close();
}
printready();
PrintDialog pd = new PrintDialog();
pd.PrinterSettings = new PrinterSettings();
if (DialogResult.OK == pd.ShowDialog(this))
{
PrintDocument pdoc = new PrintDocument();
pdoc.PrintPage += new PrintPageEventHandler(pqr);
pdoc.Print();
}
}
void pqr(object o, PrintPageEventArgs e)
{
System.Drawing.Image i = this.pictureBox1.Image;
Point p = new Point(1, 1);
e.Graphics.DrawImage(i, p);
}
private void printready()
{
string welcome = "Thank You For Visiting Dulabk";
string InvoiceNo = txtInvoiceNo.Text;
string InvoiceDate = dateTimePicker1.Value.ToLongDateString();
Bitmap bitm = new Bitmap(welcome.Length * 30, 90);
using (Graphics graphic = Graphics.FromImage(bitm))
{
int startX = 0;
int startY = 0;
int Offset = 0;
Font newfont = new Font("Arial Black", 8);
Font newfont2 = new Font("Arial Black", 10);
PointF point = new PointF(40f, 2f);
SolidBrush black = new SolidBrush(Color.Black);
SolidBrush white = new SolidBrush(Color.White);
graphic.FillRectangle(white, 0, 0, bitm.Width, bitm.Height);
graphic.DrawString("" + InvoiceNo + "", newfont2, black, startX, startY + Offset);
Offset = Offset + 20;
PointF pointPrice = new PointF(15f, 45f);
graphic.DrawString("" + InvoiceDate + "", newfont2, black, startX, startY + Offset);
Offset = Offset + 20;
PointF pointPname = new PointF(10f, 65f);
PointF pointBar = new PointF(10f, 65f);
graphic.DrawString("" + welcome + "", newfont2, black, startX, startY + Offset);
Offset = Offset + 20;
PointF pointList = new PointF(10f, 65f);
for (int i = 0; i < dataGridView1.Rows.Count; i++)
{
int ii = 1;
ii++;
graphic.DrawString(" " + dataGridView1.Rows[i].Cells[1].Value +" " + dataGridView1.Rows[i].Cells[2].Value +" " + dataGridView1.Rows[i].Cells[3].Value +"" , new Font("Arial Bold", 11),
new SolidBrush(Color.Black), startX, startY + Offset);
Offset = Offset + 20;
graphic.DrawString(" ---------- ", newfont2, black, startX, startY + Offset);
}
}
using (MemoryStream Mmst = new MemoryStream())
{
bitm.Save("ms", ImageFormat.Jpeg);
pictureBox1.Image = bitm;
pictureBox1.Width = bitm.Width;
pictureBox1.Height = bitm.Height;
}
}
Я не уверен, что является причиной этого: я попытался увеличить смещения и добавить больше строк под строками просмотра данных, но больше ничего не печатается.
EDIT
Хорошо, я нашел проблему, вот в этой строке:
Bitmap bitm = new Bitmap(welcome.Length * 30, 90);
Как я могу сделать размер изображения динамическим, а не в соответствии со значением, которое я установил в коде?