Background Image für ein DataGridView

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von mhc2004.

    Background Image für ein DataGridView

    Hallo,

    ich bin erst seit heute im Forum angemeldet, möchte Hallo sagen und auch gleich eine Frage stellen zu einem Problem wo ich nicht weiter komme.

    Ich möchte in meinem DataGridView ein Background Image einbinden und habe dazu folgenden Code im Netz gefunden.

    Leider weiss ich nicht so recht damit anzufangen.Mein DataGridView heisst DataGridView1, also Standardname.Muss ich die Klasse die ich erstelle auch umbenennen oder etwas anderes tuen, was ich auch mache ich bekomme nicht das gewünschte Image in den Hintergrund des DataGridViews.

    Die Seite zum Thema: codeproject.com/KB/grid/Datagridview_BackImage.aspx

    Und hier der Code den ich in eine neue Klasse eingefügt habe:

    VB.NET-Quellcode

    1. Public Class usrDataGridViewInherits Windows.Forms.DataGridView
    2. Private m_Image As Drawing.ImagePublic Sub New()
    3. Me.m_Image = Drawing.Image.FromFile("D:\Blue.jpg")
    4. End SubProtected Overrides Sub PaintBackground(ByVal graphics As System.Drawing.Graphics, _
    5. ByVal clipBounds As System.Drawing.Rectangle, _ByVal gridBounds As System.Drawing.Rectangle)
    6. MyBase.PaintBackground(graphics, clipBounds, gridBounds)graphics.DrawImage(Me.m_Image, gridBounds)
    7. End Sub
    8. '<description("set /> _Public Property BackImage() As Drawing.Image
    9. GetReturn Me.m_Image
    10. End GetSet(ByVal value As Drawing.Image)
    11. Me.m_Image = value
    12. End SetEnd Property
    13. End Class


    Kann mir dabei jemand behilflich sein.
    Danke...

    Grüße
    Maik
    Ungefähr so:

    VB.NET-Quellcode

    1. Dim myNewDataGridView as new usrDataGridView


    Vorher musst du allerdings noch deine neue Klasse instanzieren und die entsprechende DLL einbinden, aber ich denke das hast du natürlich schon getan :)


    Grüße
    Phil
    Oha, mein Gehirn läuft aktuell nur mit halber Kraft. Sorry ich habe Mist erzählt :). Wenn du keine DLL aus deiner abgeleiteten Klasse gemacht hast vergiss den Teil einfach. UNd die Instanzierung sollte mit

    VB.NET-Quellcode

    1. Dim myNewDataGrid as new usrDataGridView

    bereits erledigt sein. Damit erzeugst du allerdings nur eine neue Instanz des DGV, du musst es dir dann noch per Code in deiner Form anzeigen lassen, was wahrscheinlich mit

    VB.NET-Quellcode

    1. myNewDataGrid.Position.X = 123
    2. myNewDataGrid.Position.Y = 321
    3. myNewDataGrid.Visible = True

    gehen sollte. Da wendest du dich aber am besten vertrauensvoll an Intellisense und blätterst die verfügbaren Eigenschaften durch.

    Grüße
    .Phil
    Also

    VB.NET-Quellcode

    1. myNewDataGrid.Position.X = 123
    2. myNewDataGrid.Position.Y = 321
    3. myNewDataGrid.Visible = True


    geht net, weil in der Klasse des net drin steht.

    Was ich in der Form machen kann ist

    VB.NET-Quellcode

    1. myNewDataGrid.BackImage...


    in der Form habe ich jetzt stehen:

    VB.NET-Quellcode

    1. Dim myNewDataGrid As New usrDataGridView
    2. myNewDataGrid.BackImage = Drawing.Image.FromFile("D:\Blue.jpg")


    Nur leider geht es damit auch nicht. :evil:
    Irgendwie muss es ja aus der Form aufgerufen werden... 8|
    Was Du machst:

    VB.NET-Quellcode

    1. Public Class Formular
    2. private myNewDataGrid As New usrDataGridView
    3. Private Sub form_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
    4. me.controls.add(myNewDataGrid)
    5. with myNewDataGrid
    6. .left=xx
    7. .top=yy
    8. ...
    9. end with
    10. End Sub
    11. ......
    12. End Class


    Das Backimage sethst Du ja in Deiner usrDataGridView-Klasse ein.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Super Klasse, so hat es funktioniert. :) Vielen Dank ich werd es in einigen Projekten bestimmt wieder anwenden können.

    Leider hat es nicht so funktioniert wie ich es wollte.

    Ich möchte nämlich ein DataGrid mit Daten füllen, dieses dann ausdrucken aber auf dem gedruckten Blatt soll ein Bild sein.Ähnlich wie ein Firmenkopf und darunter die Tabelle. Drucken kann ich das DataGridView mit folgendem Code:

    VB.NET-Quellcode

    1. Option Strict On
    2. ''' <summary>
    3. ''' Author: Klaus D. Raudszus / VB 2005, Visual Studio Prof./ November 2006
    4. ''' </summary>
    5. ''' <remarks></remarks>Public Class DGVPrint
    6. Protected m_Pages As Int32Protected m_intTotalWidth As Int32
    7. Protected m_intPageHeight As Int32Protected m_intRowsToPrint As Int32
    8. Protected m_arColsWidth() As Int32Protected m_arHeaderText() As System.String
    9. Protected m_ftHeaderFont As Drawing.FontProtected m_DataGridView As Windows.Forms.DataGridViewProtected WithEvents m_PrintDoc As Drawing.Printing.PrintDocument
    10. Public Sub New()Me.m_Pages = 0
    11. Me.m_intTotalWidth = 0Me.m_intPageHeight = 0
    12. Me.m_intRowsToPrint = 0Me.m_ftHeaderFont = New Drawing.Font("Arial", 9.75!)
    13. End SubPublic Sub New(ByVal dgv As Windows.Forms.DataGridView)
    14. Me.New()Me.m_DataGridView = dgv
    15. ReDim Me.m_arColsWidth(Me.m_DataGridView.ColumnCount - 1)ReDim Me.m_arHeaderText(Me.m_DataGridView.ColumnCount - 1)
    16. End Sub
    17. ''' <summary>
    18. ''' Ermittelt die Orientierung der Seite und erstellt Druckvorschau
    19. ''' </summary>
    20. ''' <remarks></remarks>Public Overridable Sub Print()
    21. Me.m_PrintDoc = New Drawing.Printing.PrintDocumentAddHandler m_PrintDoc.EndPrint, AddressOf Me.EndPrint
    22. Dim intCols As Int32 = Me.m_DataGridView.ColumnCount - 1For i As Int32 = 0 To intCols
    23. Me.m_arColsWidth(i) = Me.GetColumnsSize(i)Me.m_arHeaderText(i) = Me.GetHeaderText(i)
    24. Me.m_intTotalWidth = Me.m_intTotalWidth + Me.m_arColsWidth(i)
    25. Next
    26. If Me.m_intTotalWidth > Me.m_PrintDoc.DefaultPageSettings.PaperSize.Width Then
    27. Me.m_PrintDoc.DefaultPageSettings.Landscape = TrueMe.m_PrintDoc.DefaultPageSettings.Margins.Top = 35
    28. Me.m_intPageHeight = Me.m_PrintDoc.DefaultPageSettings.PaperSize.Width
    29. ElseMe.m_intPageHeight = Me.m_PrintDoc.DefaultPageSettings.PaperSize.Height
    30. End IfDim ppd As Windows.Forms.PrintPreviewDialog = New Windows.Forms.PrintPreviewDialog()ppd.Document = Me.m_PrintDoc
    31. ppd.ShowDialog()
    32. End SubProtected Overridable Sub m_PrintDoc_PrintPage(ByVal sender As System.Object, _
    33. ByVal e As Drawing.Printing.PrintPageEventArgs) Handles m_PrintDoc.PrintPageMe.PrintHeader(e.Graphics)
    34. Me.PrintRows(e)
    35. 'Seitenzahl unten links druckenDim str As String = "Seite " & Me.m_Pages.ToString
    36. e.Graphics.DrawString(str, _Me.m_DataGridView.Font, Drawing.Brushes.Blue, _
    37. Me.m_PrintDoc.DefaultPageSettings.Margins.Left, Me.m_intPageHeight - 75)
    38. End Sub
    39. ''' <summary>
    40. ''' Methode druckt die Spaltenberschriften des DGV als Kopfzeile
    41. ''' </summary>
    42. ''' <param name="g"></param>
    43. ''' <remarks></remarks>Protected Overridable Sub PrintHeader(ByVal g As Drawing.Graphics)
    44. Dim x As Int32 = Me.m_PrintDoc.DefaultPageSettings.Margins.LeftDim y As Int32 = Me.m_PrintDoc.DefaultPageSettings.Margins.Top
    45. For i As Int32 = 0 To Me.m_arHeaderText.Length - 1g.DrawString(Me.m_arHeaderText(i), Me.m_ftHeaderFont, Drawing.Brushes.Blue, x, y)
    46. x += Me.m_arColsWidth(i)
    47. Next
    48. End Sub
    49. ''' <summary>
    50. ''' Methode druckt die Reihen und fordert bei Bedarf neue Seite an
    51. ''' </summary>
    52. ''' <param name="e"></param>
    53. ''' <remarks></remarks>Protected Overridable Sub PrintRows(ByVal e As Drawing.Printing.PrintPageEventArgs)
    54. Dim intCols As Int32 = Me.m_DataGridView.ColumnCount - 1Dim intRows As Int32 = Me.m_DataGridView.RowCount - 2
    55. Dim x As Int32 = Me.m_PrintDoc.DefaultPageSettings.Margins.LeftDim y As Int32 = Me.m_PrintDoc.DefaultPageSettings.Margins.Top + 50
    56. Me.m_Pages += 1For i As Int32 = Me.m_intRowsToPrint To intRows
    57. For ii As Int32 = 0 To intColsDim str As System.String = Me.m_DataGridView.Rows(i).Cells(ii).Value.ToString
    58. e.Graphics.DrawString(str, Me.m_DataGridView.Font, Drawing.Brushes.Black, x, y)x += Me.m_arColsWidth(ii)
    59. Nextx = Me.m_PrintDoc.DefaultPageSettings.Margins.Left
    60. y += 30If y > (Me.m_intPageHeight - _
    61. Me.m_PrintDoc.DefaultPageSettings.Margins.Bottom) Then
    62. e.HasMorePages = TrueMe.m_intRowsToPrint = i + 1
    63. Return
    64. Else
    65. e.HasMorePages = FalseMe.m_intRowsToPrint = 0
    66. End If
    67. Next
    68. End Sub
    69. ''' <summary>
    70. ''' Funktion zum Ermitteln der einzelnen Spaltenberschrift
    71. ''' </summary>
    72. ''' <param name="col">
    73. ''' šbergabe der Spaltennummer
    74. ''' </param>
    75. ''' <returns>
    76. ''' Gibt die Spaltenberschrift zurck
    77. ''' </returns>
    78. ''' <remarks></remarks>Protected Overridable Function GetHeaderText(ByVal col As Int32) As System.String
    79. Return Me.m_DataGridView.Columns(col).HeaderText
    80. End Function
    81. ''' <summary>
    82. ''' Funktion zum Ermitteln der einzelnen Spaltenbreite
    83. ''' </summary>
    84. ''' <param name="col">
    85. ''' šbergabe der Spaltennummer
    86. ''' </param>
    87. ''' <returns>
    88. ''' Gibt die Spaltebreite der ausgew„hlten Spalte zurck
    89. ''' </returns>
    90. ''' <remarks></remarks>Protected Overridable Function GetColumnsSize(ByVal col As Int32) As Int32
    91. Dim sglWidth As System.Single = 0Dim intRows As Int32 = Me.m_DataGridView.RowCount - 2
    92. Using g As Drawing.Graphics = Drawing.Graphics.FromHwnd(Me.m_DataGridView.Handle)Dim newSizeF As Drawing.SizeF = g.MeasureString(Me.GetHeaderText(col), Me.m_ftHeaderFont)
    93. sglWidth = newSizeF.Width + 15For i As Int32 = 0 To intRows
    94. newSizeF = g.MeasureString( _Me.m_DataGridView.Rows(i).Cells(col).Value.ToString, _
    95. Me.m_DataGridView.Font)If newSizeF.Width > sglWidth Then sglWidth = newSizeF.Width + 15
    96. Next
    97. End UsingReturn Convert.ToInt32(sglWidth)
    98. End FunctionProtected Overridable Sub EndPrint(ByVal sender As System.Object, ByVal e As System.Drawing.Printing.PrintEventArgs)
    99. Me.m_Pages = 0
    100. End Sub
    101. End Class

    Könnte man in diesen Code Verweise einbauen das ein Bild mit in die Druckvorschau eingefügt wird?
    Mein Bild welches auf die Druckvorschau mit drauf soll hat nur einen Banner am oberen Bildrand der Rest wäre also weiß, also es wäre ein Firmenbriefkopf.
    Geht das in diesem Code???
    Jetzt bleibe ich doch wieder hängen.

    Wie ich ein Bild aus einer Datei in der Klasse bennen kann so das es auch gedruckt wird hab ich geschafft, aber wie kann ich es anstellen wenn ich den Inhalt einer Textbox auch mit drucken möchte.

    Das drucken des DataGridViews sieht ja so aus:

    VB.NET-Quellcode

    1. Protected Overridable Sub PrintRows(ByVal e As Drawing.Printing.PrintPageEventArgs)Dim intCols As Int32 = Me.m_DataGridView.ColumnCount - 1
    2. Dim intRows As Int32 = Me.m_DataGridView.RowCount - 2Dim x As Int32 = Me.m_PrintDoc.DefaultPageSettings.Margins.Left
    3. Dim y As Int32 = Me.m_PrintDoc.DefaultPageSettings.Margins.Top + 300Me.m_Pages += 1
    4. For i As Int32 = Me.m_intRowsToPrint To intRowsFor ii As Int32 = 0 To intCols
    5. Dim str As System.String = Me.m_DataGridView.Rows(i).Cells(ii).Value.ToStringe.Graphics.DrawString(str, Me.m_DataGridView.Font, Drawing.Brushes.Black, x, y)
    6. x += Me.m_arColsWidth(ii)
    7. Nextx = Me.m_PrintDoc.DefaultPageSettings.Margins.Left
    8. y += 30If y > (Me.m_intPageHeight - _
    9. Me.m_PrintDoc.DefaultPageSettings.Margins.Bottom) Then
    10. e.HasMorePages = TrueMe.m_intRowsToPrint = i + 1
    11. Return
    12. Else
    13. e.HasMorePages = FalseMe.m_intRowsToPrint = 0
    14. End If
    15. NextEnd Sub

    Was muss ich machen das ich den Text aus einer Textbox mit drucken kann???