قمت بتحميل نموذج ل احد الاخوان في المنتدى بما يخص طباعة بيانات من داتا قريد فيو ..
الكود شغال ربي يعطيه الف عافيه ولكن توجد مشكله واحده لما اطبع البيانات تنطبع من اليسار لليمين اتجاها وكانها بيانات انجليزيه وطبعا مشروعي بلغة العربيه
ياليت احد يفيدني ب طريقة صحيحه ل تغير اتجاه البيانات في الطباعه ..
18-07-17, 04:10 PM (آخر تعديل لهذه المشاركة : 18-07-17, 04:55 PM {2} بواسطة Marwan9990.)
توجد مشكله عزيزي الادات حلوه الي ارفقتها ولكن شكلها ما رح تفيدني بسبب انها ما تطبع لي الترقيم الخاص بالاسطر في الجريد فيو هيا فقط تطبع الكولم ...
ياليت طريقة جعل طابعه تطبع من يمين لليسار الي يعرف للمثال المرفق في المشاركة الاولى ..
وهذا الكود الي استخدمه الي ابي احل مشكلته
كود :
Private Structure pageDetails
Dim columns As Integer
Dim rows As Integer
Dim startCol As Integer
Dim startRow As Integer
End Structure
Private pages As Dictionary(Of Integer, pageDetails)
Dim maxPagesWide As Integer
Dim maxPagesTall As Integer
Private Sub btnPrint_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPrint.Click
PrintDocument1.Print()
End Sub
Private Sub PrintDocument1_BeginPrint(ByVal sender As Object, ByVal e As System.Drawing.Printing.PrintEventArgs) Handles PrintDocument1.BeginPrint
''this removes the printed page margins
PrintDocument1.OriginAtMargins = True
PrintDocument1.DefaultPageSettings.Margins = New Drawing.Printing.Margins(0, 0, 0, 0)
pages = New Dictionary(Of Integer, pageDetails)
Dim maxWidth As Integer = CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Width) - 40
Dim maxHeight As Integer = CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Height) - 40 + Label1.Height
Dim pageCounter As Integer = 0
pages.Add(pageCounter, New pageDetails)
Dim columnCounter As Integer = 0
Dim columnSum As Integer = DataGridView3.RowHeadersWidth
For c As Integer = 0 To DataGridView3.Columns.Count - 1
If columnSum + DataGridView3.Columns(c).Width < maxWidth Then
columnSum += DataGridView3.Columns(c).Width
columnCounter += 1
Else
pages(pageCounter) = New pageDetails With {.columns = columnCounter, .rows = 0, .startCol = pages(pageCounter).startCol}
columnSum = DataGridView3.RowHeadersWidth + DataGridView3.Columns(c).Width
columnCounter = 1
pageCounter += 1
pages.Add(pageCounter, New pageDetails With {.startCol = c})
End If
If c = DataGridView3.Columns.Count - 1 Then
If pages(pageCounter).columns = 0 Then
pages(pageCounter) = New pageDetails With {.columns = columnCounter, .rows = 0, .startCol = pages(pageCounter).startCol}
End If
End If
Next
maxPagesWide = pages.Keys.Max + 1
pageCounter = 0
Dim rowCounter As Integer = 0
Dim rowSum As Integer = DataGridView3.ColumnHeadersHeight
For r As Integer = 0 To DataGridView3.Rows.Count - 2
If rowSum + DataGridView3.Rows(r).Height < maxHeight Then
rowSum += DataGridView3.Rows(r).Height
rowCounter += 1
Else
pages(pageCounter) = New pageDetails With {.columns = pages(pageCounter).columns, .rows = rowCounter, .startCol = pages(pageCounter).startCol, .startRow = pages(pageCounter).startRow}
For x As Integer = 1 To maxPagesWide - 1
pages(pageCounter + x) = New pageDetails With {.columns = pages(pageCounter + x).columns, .rows = rowCounter, .startCol = pages(pageCounter + x).startCol, .startRow = pages(pageCounter).startRow}
Next
pageCounter += maxPagesWide
For x As Integer = 0 To maxPagesWide - 1
pages.Add(pageCounter + x, New pageDetails With {.columns = pages(x).columns, .rows = 0, .startCol = pages(x).startCol, .startRow = r})
Next
rowSum = DataGridView3.ColumnHeadersHeight + DataGridView3.Rows(r).Height
rowCounter = 1
End If
If r = DataGridView3.Rows.Count - 2 Then
For x As Integer = 0 To maxPagesWide - 1
If pages(pageCounter + x).rows = 0 Then
pages(pageCounter + x) = New pageDetails With {.columns = pages(pageCounter + x).columns, .rows = rowCounter, .startCol = pages(pageCounter + x).startCol, .startRow = pages(pageCounter + x).startRow}
End If
Next
End If
Next
maxPagesTall = pages.Count \ maxPagesWide
End Sub
''' <summary>
''' this is the actual printing routine.
''' using the pagedetails i calculated earlier, it prints a title,
''' + as much of the datagridview as will fit on 1 page, then moves to the next page.
''' this is setup to be dynamic. try resizing the dgv columns or rows
''' </summary>
''' <param name="sender"></param>
''' <param name="e"></param>
''' <remarks></remarks>
Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage
Dim rect As New Rectangle(20, 20, CInt(PrintDocument1.DefaultPageSettings.PrintableArea.Width), Label1.Height)
Dim sf As New StringFormat
sf.Alignment = StringAlignment.Center
sf.LineAlignment = StringAlignment.Center
Dim startX As Integer = 50
Dim startY As Integer = rect.Bottom
Static startPage As Integer = 0
For p As Integer = startPage To pages.Count - 1
Dim cell As New Rectangle(startX, startY, DataGridView3.RowHeadersWidth, DataGridView3.ColumnHeadersHeight)
e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell)
e.Graphics.DrawRectangle(Pens.Black, cell)
startY += DataGridView3.ColumnHeadersHeight
For r As Integer = pages(p).startRow To pages(p).startRow + pages(p).rows - 1
cell = New Rectangle(startX, startY, DataGridView3.RowHeadersWidth, DataGridView3.Rows(r).Height)
e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell)
e.Graphics.DrawRectangle(Pens.Black, cell)
e.Graphics.DrawString(DataGridView3.Rows(r).HeaderCell.Value.ToString, DataGridView1.Font, Brushes.Black, cell, sf)
startY += DataGridView3.Rows(r).Height
Next
startX += cell.Width
startY = rect.Bottom
For c As Integer = pages(p).startCol To pages(p).startCol + pages(p).columns - 1
cell = New Rectangle(startX, startY, DataGridView3.Columns(c).Width, DataGridView3.ColumnHeadersHeight)
e.Graphics.FillRectangle(New SolidBrush(SystemColors.ControlLight), cell)
e.Graphics.DrawRectangle(Pens.Black, cell)
e.Graphics.DrawString(DataGridView3.Columns(c).HeaderCell.Value.ToString, DataGridView3.Font, Brushes.Black, cell, sf)
startX += DataGridView3.Columns(c).Width
Next
For r As Integer = pages(p).startRow To pages(p).startRow + pages(p).rows - 1
startX = 50 + DataGridView3.RowHeadersWidth
For c As Integer = pages(p).startCol To pages(p).startCol + pages(p).columns - 1
cell = New Rectangle(startX, startY, DataGridView3.Columns(c).Width, DataGridView3.Rows(r).Height)
e.Graphics.DrawRectangle(Pens.Black, cell)
'e.Graphics.DrawString(DataGridView3(c, r).Value.ToString, DataGridView3.Font, Brushes.Black, cell, sf)
startX += DataGridView3.Columns(c).Width
Next
startY += DataGridView3.Rows(r).Height
Next
If p <> pages.Count - 1 Then
startPage = p + 1
e.HasMorePages = True
Return
Else
startPage = 0
End If
Next
End Sub
Private Sub btnPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreview.Click
Dim ppd As New PrintPreviewDialog
ppd.Document = PrintDocument1
ppd.WindowState = FormWindowState.Maximized
ppd.ShowDialog()
End Sub
او اذا فيه حل اضع ترقيم في حقل او او كولم وسوف تسكتيع الاداه السابقه بعدها طباعته
فعلا اذا يمكن وضع الترقيم التلقائي في حقل رح تنحل مشكلة الاداة ياليت تفيدوني اذا هذا الشي ممكن ..
ابي ااضع الترقيم في عمود خاص بيه انا اقوم بانشاه حتى تدععمه اداة الطباعه
18-07-17, 08:18 PM (آخر تعديل لهذه المشاركة : 18-07-17, 09:11 PM {2} بواسطة Marwan9990.)
ي اخوان حصلت هذا الكود هو شغال ميه ب ميه والاداة تدعم فكرته بحيث انه تضيف حق ف داتا قريد باسم اي دي
كود :
Private Sub dgv1_CellValidating(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv1.CellValidated
For i = 0 To dgv1.Rows.Count - 1
dgv1.Rows(i).Cells("id").Value = i + 1
Next
End Sub
ولكن توجد فيه مشكله اول من تشغل الفورم تظهر كل البيانات في قريد فيو ولكن حق الترقيم لا يعطي الترقيم الا اذا تم الضغط بالماوس على احد الحقول الترقيم التلقائي
احد يعرف شو الحل انا ابي الترقيم تلقائي يظهر على طول مع باقي البيانات في قريد فيو اول من اشغل الفورم ..
الشخص الذي صمم الأداة واضح انه ليس من العرب و لهذا هو صممها لتتناسب مع احتياجات اللغة الأم الخاصة به
ان كنت تريد تحويلها الي العربية
يجب أن تعيد كل عمليات الرسم لتحدث من اليمين لليسار
وهذا الأمر يحتاج لشخص لديه وقت و أيضا يكون بيفهم في الجرافكس بشكل جيد
الله معك
الشخص الذي صمم الأداة واضح انه ليس من العرب و لهذا هو صممها لتتناسب مع احتياجات اللغة الأم الخاصة به
ان كنت تريد تحويلها الي العربية
يجب أن تعيد كل عمليات الرسم لتحدث من اليمين لليسار
وهذا الأمر يحتاج لشخص لديه وقت و أيضا يكون بيفهم في الجرافكس بشكل جيد
الله معك
اهلا عزيزي .. لا عزيزي انته فهمتي غلط .. انا ما اتكلم عن الادة الان ..
اتكلم عن مشكلة الكود الذي وضعته في مشاركة السابقه هذا ..
إقتباس :
إقتباس :
كود :
Private Sub dgv1_CellValidating(ByVal sender As System.Object, ByVal e As System.Windows.Forms.DataGridViewCellEventArgs) Handles dgv1.CellValidated
For i = 0 To dgv1.Rows.Count - 1
dgv1.Rows(i).Cells("id").Value = i + 1
Next