Prachi92 Ответов: 1

Печать C# идет бесконечно при печати значения базы данных на нескольких страницах


Я хочу напечатать значение базы данных на нескольких страницах (30 значений на одной странице). Используя while(dr.Read()) циклы идут бесконечно и одни и те же данные отображаются на каждой странице, Как это решить?

Что я уже пробовал:

private void test2_Load(object sender, EventArgs e)
        {

           itemperpage = 0;
            printPreviewDialog1.Document = printDocument1;

            ((ToolStripButton)((ToolStrip)printPreviewDialog1.Controls[1]).Items[0]).Enabled
            = false;//disable the direct print from printpreview.as when we click that Print button PrintPage event fires again.


            printDocument1.DefaultPageSettings.PaperSize = paperSize;
            printPreviewDialog1.ShowDialog();
        }


private void printDocument1_PrintPage(object sender, System.Drawing.Printing.PrintPageEventArgs e)
        {
            int kx = 25;
            int ky = 50;
            con.Close();
            con.Open();
            String sql = "SELECT * from cash_bill";
            cmd = new OleDbCommand(sql, con);
            dr1 = cmd.ExecuteReader(CommandBehavior.CloseConnection);
            
               while (dr1.Read()) 
                {
                    e.Graphics.DrawString(dr1[7].ToString(), printFont, Brushes.Black, kx + 75, ky + 5);
                   
           
                    if (itemperpage < 29) 
                    {
                        itemperpage += 1; 
                        e.HasMorePages = false; 
                        ky = ky + 50;
                    }

                    else 
                    {
                        itemperpage = 0; 
                        e.HasMorePages = true; 
                         return;

                    }
                   
                }
                con.Close();
            }

1 Ответов

Рейтинг:
1

OriginalGriff

Что ж... вы читаете одни и те же данные из БД каждый раз, когда выполняется этот метод - так что пока БД содержит 30 или более элементов, вы распечатаете первую страницу, сообщите системе, что есть еще страницы для печати, и выйдете. Затем система снова вызовет вас для печати следующей страницы, вы прочитаете те же данные из базы данных, и цикл повторится снова.

Ваш метод должен знать, какую страницу он печатает, и либо:
1) "пропустить" данные с предыдущих страниц, игнорируя уже напечатанные строки,
Или
2) (Лучше) только выборка данных для одной страницы за раз.

Вы можете сделать это многими способами, но если ваша таблица БД имеет целочисленное значение идентификатора (возможно, идентификатор), то вы можете сохранить последний напечатанный идентификатор, а затем изменить свой запрос на

SELECT TOP 30 * FROM cash_bill WHERE ID > @LastID ORDER BY ID ASC
И укажите последнее значение идентификатора, которое вы напечатали в качестве параметра. Если установить значение последнего идентификатора в int.MinValue перед печатью последней страницы, то первая страница будет напечатана автоматически.

Кроме того, вам необходимо правильно закрыть и утилизировать объекты подключения, команды и считывателя - сбросить данные. CommandBehavior.CloseConnection вещи и создавайте свои предметы внутри using блок:
using (SqlConnection con = new SqlConnection(strConnect))
    {
    con.Open();
    using (SqlCommand cmd = new SqlCommand("SELECT Age, Description FROM myTable WHERE ID = @ID", con))
        {
        cmd.Parameters.AddWithValue("@ID", myTextBox.Text);
        using (SqlDataReader reader = cmd.ExecuteReader())
            {
            while (reader.Read())
                {
                int age = (int) reader["Age"];
                string desc = (string) reader["Description"];
                Console.WriteLine($"{age}\n{desc}");
                }
            }
        }
    }
Тогда система закроется и избавится от вас сразу же, как только они выйдут из сферы действия.