منتدى فيجوال بيسك لكل العرب | منتدى المبرمجين العرب

نسخة كاملة : طباعة قائمة combobox الى ملف PDF
أنت حالياً تتصفح نسخة خفيفة من المنتدى . مشاهدة نسخة كاملة مع جميع الأشكال الجمالية .
السلام عليكم 
الكود التالي يقوم بطباعة شهادات الطلاب الى ملف PDF بشكل جماعي من تقرير ReportViewer  (أي أن جميع المخرجات تكون داخل ملف واحد) لكي يسهل علي  طباعتها بعد ذلك بكبسة زر واحدة من ملف ال PDF عوضا عن طباعة كل شهادة بتغيير قيمة combobox من الفورم في كل مرة.
المشكلة الوحيدة أن هناك بعض حقول (Parameters) في الشهادة غير مرتبطة بال Dataset ولا يتم طباعتها إلا للشهادة الحالية وتوزع على بقية الشهادات التي يفترض أن يأخذ كل طالب قيم ال Parameters الخاصة به ، ولكن هذا لا يحدث حيث تأخذ كل الشهادات قيم ال Parameters الخاصة بالشهادة الحالية اما الحقول المرتبطة بال Dataset فتتغير لكل طالب بدون أي مشاكل . مع انني عندما أختار طالب من ال Combobox تتغير جميع القيم بما فيها حقول ال Parameters 
أرجوا ان تكون المشكلة واضحة 
ودمتم بخير 

ملاحظة : هذا الكود لا يعمل إلا بعد تثبيت الملحق iTextSharp وتضمين المكتبات  iTextSharp.text  و iTextSharp.text.pdf

كود :
Private Sub PrintAll_Click(sender As Object, e As EventArgs)


       Me.Cursor = Cursors.WaitCursor
       Me.DataSet1.DataTable1.Clear()
       Me.DataTable1TableAdapter.Fill(Me.DataSet1.DataTable1)



       Dim outputFile As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "AllStudents.pdf")
       Dim document As New Document
       Dim pdfCopy As PdfCopy = New PdfCopy(document, New FileStream(outputFile, FileMode.Create))

       document.Open()
       Dim customersCopy As DataSet1.DataTable1DataTable = DataSet1.DataTable1.Copy()

       For Each row As DataRow In customersCopy.Rows
           Me.DataTable1TableAdapter.Search_ID(Me.DataSet1.DataTable1, row("ID").ToString())
           Me.ReportViewer1.RefreshReport()

           Dim pdfRenderBytes As Byte() = ReportViewer1.LocalReport.Render("PDF")
           Dim reader As New PdfReader(pdfRenderBytes)




           For i As Integer = 1 To reader.NumberOfPages
               pdfCopy.AddPage(pdfCopy.GetImportedPage(reader, i))

           Next

           reader.Close()
       Next

       document.Close()

       Process.Start(outputFile)

       Me.Cursor = Cursors.Default

   End Sub
السلام عليكم ورحمة الله وبركاته
--
بشكل عام التقارير تتكون من ثلاث مناطق : 
- الترويسة (ترويسة بأول صفحة من التقرير وترويسة لكل صفحة).
- التذييل (تذييل لكل صفحة وتذييل بخر صفحة للتقرير).
- عرض التقرير (وهي المنطقة ما بين الترويسة والتذييل).

أي بيانات تضعها ضمن الترويسة أو التذييل سيأخذها التقرير مرة واحدة وسوف تتكرر.
وأي بيانات تضعها ضمن عرض التقرير فلن تتكرر ، وسيتم سردها بحسب جملة الاستعلام التي زودت بها التقرير.

المشكلة التي تتحدث عنها توضح أن هناك خطأ بتصميم التقرير،،
مما سبق يعني : عليك أن تجعل البيانات التي لا تريد تكرارها ضمن عرض التقرير وليس في( الترويسة والتذييل).


--
أحببت أن ألفت انتباهك لهذه النقطة،، 
فهذا ما أعرفه وربما غيري يستطيع افادتك أكثر مني..
أعتذر أني لم أستطع أن أفيدك أكثر من ذلك.


--
طريقة آخرى للحل  : 
تصور أنك تبني قالب ضمن داتاتيبل .. تضع فيه كل البيانات التي تريدها لكل طالب ضمن سطر(سجل) واحد.، ثم الطالب الذي يليه ضمن السجل الثاني.
وتجعل هذا الجدول الافتراضي مصدراً لهذا التقرير، سيكون عندها الأمر أبسط..
(09-02-23, 08:38 PM)Tajaldeen كتب : [ -> ]السلام عليكم 
الكود التالي يقوم بطباعة شهادات الطلاب الى ملف PDF بشكل جماعي من تقرير ReportViewer  (أي أن جميع المخرجات تكون داخل ملف واحد) لكي يسهل علي  طباعتها بعد ذلك بكبسة زر واحدة من ملف ال PDF عوضا عن طباعة كل شهادة بتغيير قيمة combobox من الفورم في كل مرة.
المشكلة الوحيدة أن هناك بعض حقول (Parameters) في الشهادة غير مرتبطة بال Dataset ولا يتم طباعتها إلا للشهادة الحالية وتوزع على بقية الشهادات التي يفترض أن يأخذ كل طالب قيم ال Parameters الخاصة به ، ولكن هذا لا يحدث حيث تأخذ كل الشهادات قيم ال Parameters الخاصة بالشهادة الحالية اما الحقول المرتبطة بال Dataset فتتغير لكل طالب بدون أي مشاكل . مع انني عندما أختار طالب من ال Combobox تتغير جميع القيم بما فيها حقول ال Parameters 
أرجوا ان تكون المشكلة واضحة 
ودمتم بخير 

ملاحظة : هذا الكود لا يعمل إلا بعد تثبيت الملحق iTextSharp وتضمين المكتبات  iTextSharp.text  و iTextSharp.text.pdf

كود :
Private Sub PrintAll_Click(sender As Object, e As EventArgs)


       Me.Cursor = Cursors.WaitCursor
       Me.DataSet1.DataTable1.Clear()
       Me.DataTable1TableAdapter.Fill(Me.DataSet1.DataTable1)



       Dim outputFile As String = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), "AllStudents.pdf")
       Dim document As New Document
       Dim pdfCopy As PdfCopy = New PdfCopy(document, New FileStream(outputFile, FileMode.Create))

       document.Open()
       Dim customersCopy As DataSet1.DataTable1DataTable = DataSet1.DataTable1.Copy()

       For Each row As DataRow In customersCopy.Rows
           Me.DataTable1TableAdapter.Search_ID(Me.DataSet1.DataTable1, row("ID").ToString())
           Me.ReportViewer1.RefreshReport()

           Dim pdfRenderBytes As Byte() = ReportViewer1.LocalReport.Render("PDF")
           Dim reader As New PdfReader(pdfRenderBytes)




           For i As Integer = 1 To reader.NumberOfPages
               pdfCopy.AddPage(pdfCopy.GetImportedPage(reader, i))

           Next

           reader.Close()
       Next

       document.Close()

       Process.Start(outputFile)

       Me.Cursor = Cursors.Default

   End Sub

(09-02-23, 09:40 PM)Taha Okla كتب : [ -> ]السلام عليكم ورحمة الله وبركاته
--
بشكل عام التقارير تتكون من ثلاث مناطق : 
- الترويسة (ترويسة بأول صفحة من التقرير وترويسة لكل صفحة).
- التذييل (تذييل لكل صفحة وتذييل بخر صفحة للتقرير).
- عرض التقرير (وهي المنطقة ما بين الترويسة والتذييل).

أي بيانات تضعها ضمن الترويسة أو التذييل سيأخذها التقرير مرة واحدة وسوف تتكرر.
وأي بيانات تضعها ضمن عرض التقرير فلن تتكرر ، وسيتم سردها بحسب جملة الاستعلام التي زودت بها التقرير.

المشكلة التي تتحدث عنها توضح أن هناك خطأ بتصميم التقرير،،
مما سبق يعني : عليك أن تجعل البيانات التي لا تريد تكرارها ضمن عرض التقرير وليس في( الترويسة والتذييل).


--
أحببت أن ألفت انتباهك لهذه النقطة،، 
فهذا ما أعرفه وربما غيري يستطيع افادتك أكثر مني..
أعتذر أني لم أستطع أن أفيدك أكثر من ذلك.


--
طريقة آخرى للحل  : 
تصور أنك تبني قالب ضمن داتاتيبل .. تضع فيه كل البيانات التي تريدها لكل طالب ضمن سطر(سجل) واحد.، ثم الطالب الذي يليه ضمن السجل الثاني.
وتجعل هذا الجدول الافتراضي مصدراً لهذا التقرير، سيكون عندها الأمر أبسط..

هل توصلت للحل؟؟؟