2012-12-10 36 views
0

這裏是我的代碼:如何從printpreview對話框中刪除時間?

Imports System.Data.OleDb 
Imports System.Drawing.Printing 
Namespace Print 
Public Class Form1 

    Inherits System.Windows.Forms.Form 

    Dim PrintC As PrinterClass 
    Dim conn As OleDb.OleDbConnection 

    Dim connectionString As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\\db1.mdb" 

    Dim sql As String = String.Empty 
    Dim ds As DataSet 

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load 

     FillDataGrid() 
     '//create printerclass object 
     PrintC = New PrinterClass(PrintDocument1, dataGrid) 
    End Sub 

    Private Sub FillDataGrid() 

     Try 

      Dim dt As New DataTable 
      Dim ds As New DataSet 

      ds.Tables.Add(dt) 
      Dim da As New OleDbDataAdapter 


      con.Open() 
      da = New OleDbDataAdapter("SELECT * from klient ", con) 

      da.Fill(dt) 

      con.Close() 

      dataGrid.DataSource = dt.DefaultView 

      Dim dTable As DataTable 
      For Each dTable In ds.Tables 

       Dim dgStyle As DataGridTableStyle = New DataGridTableStyle 
       dgStyle.MappingName = dTable.TableName 
       dataGrid.TableStyles.Add(dgStyle) 

      Next 
      ' DataGrid settings 
      dataGrid.CaptionText = "TE GJITHE KLIENTET" 
      dataGrid.HeaderFont = New Font("Verdana", 12) 
      dataGrid.TableStyles(0).GridColumnStyles(0).Width = 60 
      dataGrid.TableStyles(0).GridColumnStyles(1).Width = 140 
      dataGrid.TableStyles(0).GridColumnStyles(2).Width = 140 
      dataGrid.TableStyles(0).GridColumnStyles(3).Width = 140 
      dataGrid.TableStyles(0).GridColumnStyles(4).Width = 140 
      dataGrid.TableStyles(0).GridColumnStyles(5).HeaderText = "" 
      dataGrid.TableStyles(0).GridColumnStyles(5).Width = -1 


     Catch ex As Exception 

      MessageBox.Show(ex.Message) 

     End Try 
    End Sub 

    Private Sub btnPrint_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPrint.Click 
     'create printerclass object 
     PrintC = New PrinterClass(PrintDocument1, dataGrid) 

     PrintDocument1.Print() 
    End Sub 

    Private Sub btnPreview_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnPreview.Click 

     'create printerclass object 
     PrintC = New PrinterClass(PrintDocument1, dataGrid) 

     ''preview 
     Dim ps As New PaperSize("A4", 840, 1150) 
     ps.PaperName = PaperKind.A4 
     PrintDocument1.DefaultPageSettings.PaperSize = ps 

     PrintPreviewDialog1.WindowState = FormWindowState.Normal 
     PrintPreviewDialog1.StartPosition = FormStartPosition.CenterScreen 
     PrintPreviewDialog1.ClientSize = New Size(600, 600) 

     PrintPreviewDialog1.ShowDialog() 

    End Sub 


    Private Sub PrintDocument1_PrintPage(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintPageEventArgs) Handles PrintDocument1.PrintPage 
     'print grid 

     Dim morepages As Boolean = PrintC.Print(e.Graphics) 
     If (morepages) Then 

      e.HasMorePages = True 
     End If 

    End Sub 

End Class 
End Namespace 

這是數據的外觀DataGrid中(這是完美的)...

enter image description here

,這裏是它的外觀,當我點擊打印預覽。 (我不想的時候出現在那裏,「12:00:00」的一部分。在數據庫中的日期存儲爲短日期(10日 - 12月12)

enter image description here

能有人建議周圍的一種方式?

Imports System 
Imports System.Windows.Forms 
Imports System.Drawing 
Imports System.Drawing.Printing 
Imports System.Collections 
Imports System.Data 
Namespace Print 
Public Class PrinterClass 
    '//clone of Datagrid 
    Dim PrintGrid As Grid 

    '//printdocument for initial printer settings 
    Private PrintDoc As PrintDocument 

    '//defines whether the grid is ordered right to left 
    Private bRightToLeft As Boolean 

    '//Current Top 
    Private CurrentY As Single = 0 

    '//Current Left 
    Private CurrentX As Single = 0 

    '//CurrentRow to print 
    Private CurrentRow As Integer = 0 

    '//Page Counter 
    Public PageCounter As Integer = 0 

    '/// <summary> 
    '/// Constructor Class 
    '/// </summary> 
    '/// <param name="pdocument"></param> 
    '/// <param name="dgrid"></param> 
    Public Sub New(ByVal pdocument As PrintDocument, ByVal dgrid As DataGrid) 
     'MyBase.new() 

     PrintGrid = New Grid(dgrid) 
     PrintDoc = pdocument 

     '//The grid columns are right to left 
     bRightToLeft = dgrid.RightToLeft = RightToLeft.Yes 

     '//init CurrentX and CurrentY 
     CurrentY = pdocument.DefaultPageSettings.Margins.Top 
     CurrentX = pdocument.DefaultPageSettings.Margins.Left 


    End Sub 

    Public Function Print(ByVal g As Graphics, ByRef currentX As Single, ByRef currentY As Single) As Boolean 

     '//use predefined area 
     currentX = currentX 
     currentY = currentY 

     PrintHeaders(g) 

     Dim Morepages As Boolean = PrintDataGrid(g) 

     currentY = currentY 
     currentX = currentX 

     Return Morepages 


    End Function 

    Public Function Print(ByVal g As Graphics) As Boolean 

     CurrentX = PrintDoc.DefaultPageSettings.Margins.Left 
     CurrentY = PrintDoc.DefaultPageSettings.Margins.Top 
     PrintHeaders(g) 
     Return PrintDataGrid(g) 
    End Function 

    '/// <summary> 
    '/// Print the Grid Headers 
    '/// </summary> 
    '/// <param name="g"></param> 
    Private Sub PrintHeaders(ByVal g As Graphics) 

     Dim sf As StringFormat = New StringFormat 

     '//if we want to print the grid right to left 
     If (bRightToLeft) Then 

      CurrentX = PrintDoc.DefaultPageSettings.PaperSize.Width - PrintDoc.DefaultPageSettings.Margins.Right 
      sf.FormatFlags = StringFormatFlags.DirectionRightToLeft 
     Else 
      CurrentX = PrintDoc.DefaultPageSettings.Margins.Left 
     End If 
     Dim i As Integer 
     For i = 0 To PrintGrid.Columns - 1 

      '//set header alignment 
      Select Case (CType(PrintGrid.Headers.GetValue(i), Header).Alignment) 
       Case HorizontalAlignment.Left 'left 
        sf.Alignment = StringAlignment.Near 
       Case HorizontalAlignment.Center 
        sf.Alignment = StringAlignment.Center 
       Case HorizontalAlignment.Right 
        sf.Alignment = StringAlignment.Far 
      End Select 


      '//advance X according to order 
      If (bRightToLeft) Then 


       '//draw the cell bounds (lines) and back color 
       g.FillRectangle(New SolidBrush(PrintGrid.HeaderBackColor), CurrentX - PrintGrid.Headers(i).Width, CurrentY, PrintGrid.Headers(i).Width, PrintGrid.Headers(i).Height) 
       g.DrawRectangle(New Pen(PrintGrid.LineColor), CurrentX - PrintGrid.Headers(i).Width, CurrentY, PrintGrid.Headers(i).Width, PrintGrid.Headers(i).Height) 

       '//draw the cell text 
       g.DrawString(PrintGrid.Headers(i).CText, PrintGrid.Headers(i).Font, New SolidBrush(PrintGrid.HeaderForeColor), New RectangleF(CurrentX - PrintGrid.Headers(i).Width, CurrentY, PrintGrid.Headers(i).Width, PrintGrid.Headers(i).Height), sf) 
       '//next cell 
       CurrentX -= PrintGrid.Headers(i).Width 
      Else 
       '//draw the cell bounds (lines) and back color 
       g.FillRectangle(New SolidBrush(PrintGrid.HeaderBackColor), CurrentX, CurrentY, PrintGrid.Headers(i).Width, PrintGrid.Headers(i).Height) 
       g.DrawRectangle(New Pen(PrintGrid.LineColor), CurrentX, CurrentY, PrintGrid.Headers(i).Width, PrintGrid.Headers(i).Height) 


       '//draw the cell text 
       g.DrawString(PrintGrid.Headers(i).CText, PrintGrid.Headers(i).Font, New SolidBrush(PrintGrid.HeaderForeColor), New RectangleF(CurrentX, CurrentY, PrintGrid.Headers(i).Width, PrintGrid.Headers(i).Height), sf) 

       '//next cell 
       CurrentX += PrintGrid.Headers(i).Width 
      End If 
     Next 

     '//reset to beginning 
     If (bRightToLeft) Then 
      '//right align 
      CurrentX = PrintDoc.DefaultPageSettings.PaperSize.Width - PrintDoc.DefaultPageSettings.Margins.Right 
     Else 
      '//left align 
      CurrentX = PrintDoc.DefaultPageSettings.Margins.Left 
     End If 

     '//advance to next row 
     CurrentY = CurrentY + CType(PrintGrid.Headers.GetValue(0), Header).Height 

    End Sub 



    Private Function PrintDataGrid(ByVal g As Graphics) As Boolean 
     Dim sf As StringFormat = New StringFormat 
     PageCounter = PageCounter + 1 

     '//if we want to print the grid right to left 
     If (bRightToLeft) Then 
      CurrentX = PrintDoc.DefaultPageSettings.PaperSize.Width - PrintDoc.DefaultPageSettings.Margins.Right 
      sf.FormatFlags = StringFormatFlags.DirectionRightToLeft 
     Else 
      CurrentX = PrintDoc.DefaultPageSettings.Margins.Left 
     End If 
     Dim i As Integer 
     For i = CurrentRow To PrintGrid.Rows - 1 
      Dim j As Integer 
      For j = 0 To PrintGrid.Columns - 1 

       '//set cell alignment 
       Select Case (PrintGrid.Cell(i, j).Alignment) 
        '//left 
       Case HorizontalAlignment.Left 
         sf.Alignment = StringAlignment.Near 

        Case HorizontalAlignment.Center 
         sf.Alignment = StringAlignment.Center 


         '//right 
        Case HorizontalAlignment.Right 
         sf.Alignment = StringAlignment.Far 

       End Select 

       '//advance X according to order 
       If (bRightToLeft) Then 
        '//draw the cell bounds (lines) and back color 
        g.FillRectangle(New SolidBrush(PrintGrid.BackColor), CurrentX - PrintGrid.Cell(i, j).Width, CurrentY, PrintGrid.Cell(i, j).Width, PrintGrid.Cell(i, j).Height) 
        g.DrawRectangle(New Pen(PrintGrid.LineColor), CurrentX - PrintGrid.Cell(i, j).Width, CurrentY, PrintGrid.Cell(i, j).Width, PrintGrid.Cell(i, j).Height) 

        '//draw the cell text 
        g.DrawString(PrintGrid.Cell(i, j).CText, PrintGrid.Cell(i, j).Font, New SolidBrush(PrintGrid.ForeColor), New RectangleF(CurrentX - PrintGrid.Cell(i, j).Width, CurrentY, PrintGrid.Cell(i, j).Width, PrintGrid.Cell(i, j).Height), sf) 

        '//next cell 
        CurrentX -= PrintGrid.Cell(i, j).Width 
       Else 
        '//draw the cell bounds (lines) and back color 
        g.FillRectangle(New SolidBrush(PrintGrid.BackColor), CurrentX, CurrentY, PrintGrid.Cell(i, j).Width, PrintGrid.Cell(i, j).Height) 
        g.DrawRectangle(New Pen(PrintGrid.LineColor), CurrentX, CurrentY, PrintGrid.Cell(i, j).Width, PrintGrid.Cell(i, j).Height) 
        '//draw the cell text 
        '//Draw text by alignment 
        g.DrawString(PrintGrid.Cell(i, j).CText, PrintGrid.Cell(i, j).Font, New SolidBrush(PrintGrid.ForeColor), New RectangleF(CurrentX, CurrentY, PrintGrid.Cell(i, j).Width, PrintGrid.Cell(i, j).Height), sf) 

        '//next cell 
        CurrentX += PrintGrid.Cell(i, j).Width 
       End If 


      Next 

      '//reset to beginning 
      If (bRightToLeft) Then 
       '//right align 
       CurrentX = PrintDoc.DefaultPageSettings.PaperSize.Width - PrintDoc.DefaultPageSettings.Margins.Right 
      Else 
       '//left align 
       CurrentX = PrintDoc.DefaultPageSettings.Margins.Left 
      End If 

      '//advance to next row 
      CurrentY += PrintGrid.Cell(i, 0).Height 
      CurrentRow += 1 
      '//if we are beyond the page margin (bottom) then we need another page, 
      '//return true 
      If (CurrentY > PrintDoc.DefaultPageSettings.PaperSize.Height - PrintDoc.DefaultPageSettings.Margins.Bottom) Then 

       Return True 
      End If 
     Next 
     Return False 

    End Function 
End Class 
End Namespace 
+0

很明顯,問題出現在「PrinterClass」中。你沒有發佈它的代碼,所以你可能沒有寫它,也沒有意識到它的重要性。診斷是它使用DateTime的默認格式,這當然包括時間。 –

+0

謝謝@Hans我剛剛添加了上面的類。你是對的,我沒有自己寫,它對我目前的水平來說有點太高級了。 –

+0

那麼,永遠不要使用你不明白的代碼。如果您希望有人爲您重寫它,那麼您將發佈到錯誤的網站。 –

回答

1

樺林,

我認爲

'//draw the cell text 
g.DrawString(PrintGrid.Cell(i, j).CText, PrintGrid.Cell(i, j).Font, New SolidBrush(PrintGrid.ForeColor), New RectangleF(CurrentX - PrintGrid.Cell(i, j).Width, CurrentY, PrintGrid.Cell(i, j).Width, PrintGrid.Cell(i, j).Height), sf) 
設置斷點它可能是有用的

準確瞭解發生了什麼事。如果沒有運行這樣一個斷點,並從該資源here,我的第一個猜測可能是這樣的:

If j = PrintGrid.Columns - 1 Then 
    Dim pattern As String = "MM-dd-yy" 
    If DateTime.TryParseExact(PrintGrid.Cell(i, j).CText, pattern, Nothing, DateTimeStyles.None, PrintGrid.Cell(i, j).CText) Then 
    g.DrawString(PrintGrid.Cell(i, j).CText, PrintGrid.Cell(i, j).Font, New SolidBrush(PrintGrid.ForeColor), New RectangleF(CurrentX - PrintGrid.Cell(i, j).Width, CurrentY, PrintGrid.Cell(i, j).Width, PrintGrid.Cell(i, j).Height), sf) 
Else 
    g.DrawString(PrintGrid.Cell(i, j).CText, PrintGrid.Cell(i, j).Font, New SolidBrush(PrintGrid.ForeColor), New RectangleF(CurrentX - PrintGrid.Cell(i, j).Width, CurrentY, PrintGrid.Cell(i, j).Width, PrintGrid.Cell(i, j).Height), sf) 
End If 

這試圖解析列的文本(在你的情況下,PrintGrid.Columns - 1號電池)作爲一個日期,如果它成功了,那麼它將新格式化的文本放回到列中,然後再將它發送到打印子。我非常懷疑這個代碼會按原樣工作,但是對於日期時間格式的正確字符串進行一些調試和應用......我認爲這是正確的方向。

+0

非常感謝你的朋友,你讓我跟蹤你的答案,然後我用另一種方式解決它,使用字符串Split :)我發佈了我的解決方案,如果其他人發現它有幫助。 –

+1

絕對受歡迎!樂意效勞 :) – sacredfaith

0

根據@SacredFaith發佈的答案,我解決了這個問題有點不同。 下面是使用字符串拆分的解決方案:

    '//Draw text by alignment 
        ' g.DrawString(PrintGrid.Cell(i, j).CText, PrintGrid.Cell(i, j).Font, New SolidBrush(PrintGrid.ForeColor), New RectangleF(CurrentX, CurrentY, PrintGrid.Cell(i, j).Width, PrintGrid.Cell(i, j).Height), sf) 

        If j = 3 Or j = 4 Then 
         Dim st As String = PrintGrid.Cell(i, j).CText.ToString 
         Dim t As Array = st.Split(" ") 
         g.DrawString(t(0), PrintGrid.Cell(i, j).Font, New SolidBrush(PrintGrid.ForeColor), New RectangleF(CurrentX, CurrentY, PrintGrid.Cell(i, j).Width, PrintGrid.Cell(i, j).Height), sf) 
        Else 
         g.DrawString(PrintGrid.Cell(i, j).CText, PrintGrid.Cell(i, j).Font, New SolidBrush(PrintGrid.ForeColor), New RectangleF(CurrentX, CurrentY, PrintGrid.Cell(i, j).Width, PrintGrid.Cell(i, j).Height), sf) 
        End If 
相關問題