VB.Net Drucken der Werte aus DGV

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 76 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    @Kasi Ich hatte eigentlich vor, dass @uNbRaKe sein Problem allein löst.
    Wenn Du ihm alles vorgibst, ist das nicht unbedingt hilfreich.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @Kasi Unterlass das vollständige Zitieren von Posts über den Deinen!
    Post #14 beschereibt das Drucken von Tabellen, das ist doch ein ganz anderer Hammer als das Rechnen mit Datümmern und Zeitspannen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    also ich bin sonst nicht kleinlich, aber bei -Drucken von Tabellen- kann man dem TE die Lösung Posten,
    beim Umrechnen von Minuten nach Zeit soll man TE nicht helfen bis er von selbst darauf kommt

    bin neu hier, also wenn es Foren Regeln gibt und ich was falsch gemacht habe dann sorry !
    ich schau nach ob ich was zu Foren Regel finde
    Vielen Dank für die Hilfe, aber wie wende ich das bei der Addition der Spalte an? Ich verstehe die vorgegebene Funktion leider nicht wirklich.

    Und ich habe leider immer noch das Problem mit dem Tabellendruck, ich bin noch auf keine Lösung gestoßen, wie automatisch ermittelt wird, wie viele Datensätze vorhanden sind und diese auf die Seiten ausdruckt. Des weiteren wird beim Druck-Kopf nicht mehr befüllt.

    uNbRaKe schrieb:

    wie automatisch ermittelt wird, wie viele Datensätze vorhanden sind
    Dann geh noch mal zurück zu Deiner Ur-Version, die Du hoffentlich gespeichert hast.
    Da war doch ein DGV, wo n Zeilen befüllt waren.
    Wie ermittelt man die Anzahl der vorhandenen Zeilen eines DGV?
    Definiere Addition der Spalte, bitte sorgfältig.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Bei meiner Ur-Version ist nichts anders, bis auf den Teil des Druckens der Datensätze.

    Ich habe das Problem, dass Text aus Textboxen nicht mehr gedruckt wird, obwohl ich dort nichts verändert habe.

    VB.NET-Quellcode

    1. DataGridView.Rows.Count.ToString
    so gibt man die Anzahl aus.

    Mit Addition der Spalte meine ich die ganzen Zeilen innerhalb einer Spalte im Format 00:05 etc..

    VB.NET-Quellcode

    1. Dim summe As Integer
    2. For i As Integer = 0 To DataDataGridView.Rows.Count - 1
    3. If DataDataGridView.Rows(i).Cells(3).Value.ToString IsNot DBNull.Value Then
    4. summe += CInt(DataDataGridView.Rows(i).Cells(3).Value)
    5. End If
    6. Next
    7. TextBox11.Text = summe.ToString()

    dies ist die rechnung dazu, jedoch erscheint die Fehlermeldung, dass 00:05 nicht in Integer konvertiert werden kann.
    Ich nehme an dabei soll die Funktion helfen. Aber wie ich diese verwende verstehe ich nicht.

    VB.NET-Quellcode

    1. Private Function m(ByVal mt As Integer) As String
    2. 'dein Integer wert in Minuten
    3. Dim ts As New TimeSpan(0, mt, 0)
    4. 'Gesamt Std. in Format..z.b. 142:23 Stunden und Minuten
    5. Dim s As String = String.Format("{0:00}:{1:00}", Math.Floor(ts.TotalHours), ts.Minutes)
    6. Return s
    7. End Function


    Edit:

    ich bin jetzt soweit, dass die Anzahl der Datensätze automatisch ermittelt wird, jedoch verstehe ich nicht, wieso immer derselbe Datensatz gedruckt wird aber den Fehler der Textboxen habe ich gelöst.

    Edit2: Ich weiß jetzt warum immer der selbe Datensatz gedruckt wird. Und zwar liegt das daran, dass

    VB.NET-Quellcode

    1. Dim row1 As DataGridViewRow = DataDataGridView.Rows(1)
    die Variable row1 angibt, welche Zeile gedruckt wird. Ich muss ja definieren, welche Zeilen alle gedruckt werden sollen richtig?

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „uNbRaKe“ ()

    uNbRaKe schrieb:

    VB.NET-Quellcode

    1. Rows(1)
    Offensichtlich holst Du immer die zweite Zeile aus dem DGV raus.
    Verwende eine Lauf-Variable.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    uNbRaKe schrieb:


    Ich nehme an dabei soll die Funktion helfen. Aber wie ich diese verwende verstehe ich nicht.


    hier zu verständnis

    VB.NET-Quellcode

    1. Public Class Form4
    2. Dim tb As DataTable = New DataTable
    3. Private Sub Form4_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load
    4. tb.Columns.Add("ID")
    5. tb.Columns.Add("Stunden")
    6. tb.Rows.Add("1", "08:33")
    7. tb.Rows.Add("2", "01:01")
    8. tb.Rows.Add("3", "09:32")
    9. DataGridView1.DataSource = tb
    10. End Sub
    11. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    12. 'addiere Zeit zu Gesamtstunden
    13. Dim ts As TimeSpan = New TimeSpan(
    14. (From row As DataGridViewRow In DataGridView1.Rows
    15. Where row.Cells(1).FormattedValue.ToString() <> String.Empty
    16. Select DateTime.ParseExact(row.Cells(1).FormattedValue, "HH:mm", Nothing).TimeOfDay.Ticks
    17. ).Sum())
    18. Dim z1 As String = String.Format("{0:00}:{1:00}", _
    19. Math.Floor(ts.TotalHours), ts.Minutes)
    20. txtGesamtMinuten.Text = z1
    21. End Sub
    22. End Class
    @RodFromGermany das heißt ich brauch eine for-schleife, mit der ich sage, dass vom ersten Datensatz bis zum letzten Datensatz gedruckt werden soll? Der letzte Datensatz ist dann

    VB.NET-Quellcode

    1. Dim A As Integer = DataDataGridView.Rows.Count
    und der Beginn ist bei 0 für den ersten Datensatz. Zb

    VB.NET-Quellcode

    1. Dim row0 As DataGridViewRow = Me.DataDataGridView.Rows(0)
    2. Dim A As Integer = DataDataGridView.Rows.Count
    3. For Variable = row0 To A
    4. Next
    ?

    @Kasi "Option Strict On" lässt keine impliziten Konvertierungen von "Object" in "DataGridViewRow" zu.

    VB.NET-Quellcode

    1. ​From row As DataGridViewRow In DataDataGridView.Rows
    ich habe schon versucht richtig zu konvertieren doch leider zu keiner lösung gekommen


    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „uNbRaKe“ ()

    @uNbRaKe Diese For-Schleife findest Du im Post #14 in Zeile 70.
    Hast Du alles, was wir mühselig erarbeitet haben, vergessen oder gelöscht?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. ​Dim mRow As Integer = 0
    2. Dim newpage As Boolean = True
    3. Dim fmt As StringFormat = New StringFormat(StringFormatFlags.LineLimit)
    4. fmt.LineAlignment = StringAlignment.Center
    5. fmt.Trimming = StringTrimming.EllipsisCharacter
    6. Dim y As Single = e.MarginBounds.Top + 70
    7. Dim cell1 = New Rectangle(0, 0, 60, 30)
    8. Dim x As Single = 25
    9. Dim rc As RectangleF
    10. Dim row As DataGridViewRow = Me.DataDataGridView.Rows(0)
    11. For Each cell As DataGridViewCell In row.Cells
    12. rc = New RectangleF(x, y, 75, cell.Size.Height)
    13. e.Graphics.DrawString(Me.DataDataGridView.Columns(cell.ColumnIndex).HeaderText, fon, Brushes.Black, rc, fmt)
    14. e.Graphics.DrawRectangle(Pens.Black, rc.Left, rc.Top, rc.Width, rc.Height)
    15. x += rc.Width
    16. Next
    17. Dim h As Single = rc.Height
    18. y += h
    19. For mRow = Me.ActLine To Math.Min(Me.ActLine + 29, Me.LineCount - 1)
    20. Dim row0 As DataGridViewRow = Me.DataDataGridView.Rows(0)
    21. x = 25
    22. For Each cell As DataGridViewCell In row0.Cells
    23. rc = New RectangleF(x, y, 75, cell.Size.Height)
    24. e.Graphics.DrawRectangle(Pens.Black, rc.Left, rc.Top, rc.Width, rc.Height)
    25. e.Graphics.DrawString(Me.DataDataGridView.Rows(cell.RowIndex).Cells(cell.ColumnIndex).FormattedValue.ToString(), fon, Brushes.Black, rc, fmt)
    26. x += rc.Width
    27. h = Math.Max(h, rc.Height)
    28. Next
    29. y += h
    30. If y + h > e.MarginBounds.Bottom Then
    31. e.HasMorePages = True
    32. Exit For
    33. End If
    34. Next
    35. If mRow < Me.LineCount - 1 Then
    36. e.HasMorePages = True
    37. End If
    38. Me.ActLine = mRow


    genau so habe ich es.

    Das Problem ist doch , dass

    VB.NET-Quellcode

    1. ​Dim row0 As DataGridViewRow = Me.DataDataGridView.Rows(0)
    nur dieser eine Datensatz gedruckt wird.

    uNbRaKe schrieb:

    VB.NET-Quellcode

    1. Dim row0 As DataGridViewRow = Me.DataDataGridView.Rows(0)
    Probierma

    VB.NET-Quellcode

    1. Dim row0 As DataGridViewRow = Me.DataDataGridView.Rows(mRow)
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    uNbRaKe schrieb:

    auf die letzte Seite des Ausdrucks
    wenn Du die letzte Zeile des DGV gedruckt hast.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @RodFromGermany

    Ich stehe jetzt vor einem neuen Problem und zwar möchte ich mit der Summe der Spalte des DGVs rechnen. Ich habe zwei Textfelder. Eines für die Arbeitstage und eines für die Arbeitsstunden. Diese sollen multipliziert werden und anschließend in einer Variable gespeichert werden, die dann aufgedruckt wird. Ebenso soll das Ergebnis dann von der Summe der Spalten des DGvs abgezogen werden.

    Soweit so gut.

    VB.NET-Quellcode

    1. Dim String1 As String = TextBox13.Text
    2. Dim Arbeitstage As Integer = Integer.Parse(String1)
    3. Dim String2 As String = TextBox12.Text
    4. Dim Arbeitsstunden As Integer = Integer.Parse(String2)
    5. Dim ts As TimeSpan = New TimeSpan(
    6. Arbeitstage * Arbeitsstunden)
    7. Dim ArbeitsstundenSumme As String = String.Format("{0:00}:{1:00}",
    8. Math.Floor(ts.TotalHours), ts.Minutes)
    9. Dim sTime1 As New System.DateTime
    10. Dim sTime2 As New System.DateTime
    11. Dim sTime1S As String = sTime1.ToString()
    12. Dim sTime2S As String = sTime2.ToString()
    13. sTime1S = TextBox11.Text
    14. sTime2S = ArbeitsstundenSumme
    15. MessageBox.Show(sTime1S, sTime2S)
    16. Dim time1 As TimeSpan = TimeSpan.Parse(sTime1S) 'und hier erscheint der Fehler, mindestens eine der numerischen Komponenten außerhalb des gültigen Bereichs befindet oder zu viele Ziffern enthält
    17. Dim time2 As TimeSpan = TimeSpan.Parse(sTime2S)
    18. Dim nMin As Integer = 0
    19. With sTime1.Subtract(sTime2)
    20. nMin = .Hours * 60 + .Minutes
    21. End With
    22. Dim sTime As String = New TimeSpan(0, nMin, 0).ToString.Substring(0, 5)
    23. Dim Überstunden = sTime.ToString()


    Das ist mein Code dazu.

    uNbRaKe schrieb:


    VB.NET-Quellcode

    1. Dim time1 As TimeSpan = TimeSpan.Parse(sTime1S) 'und hier erscheint der Fehler, mindestens eine der numerischen Komponenten außerhalb des gültigen Bereichs befindet oder zu viele Ziffern enthält
    2. Dim time2 As TimeSpan = TimeSpan.Parse(sTime2S)


    Das wird wohl beides knallen. Warum? Weil ein DateTime nun einmal kein TimeSpan ist. Quelle: Konvertiert die Zeichenfolgendarstellung eines [b]Zeitintervalls[/b] in die entsprechende TimeSpan.
    @RodFromGermany also gedruckt wird die Summe der Spalte im richtigen Format (hh:MM), ebenso wird der Wert aus TextBox13 (Arbeitstage) und der Wert aus TextBox12 (Arbeitsstunden) gedruckt.

    Was noch passieren soll ist, dass die Arbeitstage und die Arbeitsstunden multipliziert werden sollen und ebenso im Format hh:MM gedruckt werden soll. Außerdem möchte ich die Differenz von Spaltensumme und Arbeitsstunden*Arbeitstage drucken.

    Die MUltiplikation

    VB.NET-Quellcode

    1. Dim ts As TimeSpan = New TimeSpan(
    2. Arbeitstage * Arbeitsstunden)
    3. Dim ArbeitsstundenSumme As String = String.Format("{0:00}:{1:00}",
    4. Math.Floor(ts.TotalHours), ts.Minutes)
    5. TextBox11.Text = ArbeitsstundenSumme

    geht so nicht da so der Wert 00:00 erscheint

    und hier erscheint ein Fehler

    VB.NET-Quellcode

    1. Dim time1 As TimeSpan = TimeSpan.Parse(sTime1S) 'und hier erscheint der Fehler, mindestens eine der numerischen Komponenten außerhalb des gültigen Bereichs befindet oder zu viele Ziffern enthält


    @Dksksm
    genau so hab ich das aber schonmal verwendet und dort funktioniert es