Datagridview Inhalt automatisch ändern

  • VB.NET

Es gibt 26 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    Datagridview Inhalt automatisch ändern

    Hallo zusammen ;)

    Ich habe folgenes Problem:

    Ich habe eine Form mit einem Datagridview.
    Außerdem eine MySql-Tabelle. In der MySql-Tabelle gibt es die Spalte "Time"
    Dort ist in ein Timestamp konventiertes Datum enthalten.

    DLL:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class timestamp
    2. Function GetTimestamp(ByVal FromDateTime As DateTime) As Integer
    3. Dim Startdate As DateTime = #1/1/1970#
    4. Dim Spanne As TimeSpan
    5. Spanne = FromDateTime.Subtract(Startdate)
    6. Return CType(Math.Abs(Spanne.TotalSeconds()), Integer)
    7. End Function
    8. Function GetDateFromTimestamp(ByVal unixTimestamp As Integer) As DateTime
    9. Dim Span As TimeSpan
    10. Dim Startdate As Date = #1/1/1970#
    11. If unixTimestamp = 0 Then Return Startdate
    12. Span = New TimeSpan(0, 0, unixTimestamp)
    13. Return Startdate.Add(Span)
    14. End Function
    15. End Class


    Beispielsweise: 01.06.2011 15:08:58 -> 1306940938

    Soweit ist alles okay.

    Jetzt füge ich die gesamte Tabelle in mein Datagridview ein.

    VB.NET-Quellcode

    1. Dim dgv As DataGridView = DataGridView1
    2. Dim conn As MySqlConnection
    3. conn = New MySqlConnection
    4. conn.ConnectionString = "server=" & Mainform.server & "; user id=" & Mainform.user & "; password=" & Mainform.password & "; database=" & Mainform.database
    5. conn.Open()
    6. Dim myAdapter As New MySqlDataAdapter
    7. Dim SQLAbfrage As String = "SELECT * FROM tierag_log"
    8. Dim myCommand As New MySqlCommand
    9. myCommand.Connection = conn
    10. myCommand.CommandText = SQLAbfrage
    11. myAdapter.SelectCommand = myCommand
    12. Dim myData As MySqlDataReader
    13. myData = myCommand.ExecuteReader()
    14. ds = New DataSet()
    15. conn.Close()
    16. Try
    17. conn.Open()
    18. myAdapter.Fill(ds, "Logs")
    19. conn.Close()
    20. dgv.DataSource = ds.Tables("Logs")
    21. Catch ex As Exception
    22. MsgBox(ex.Message)
    23. End Try
    24. formatdatagridcomputer(DataGridView1)
    25. DataGridView1.RowHeadersVisible = False

    Formatierungen:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub formatdatagridcomputer(ByVal dgv2 As DataGridView)
    2. 'Bestimmt die Hintergrundfarben des Datagridviews
    3. dgv2.RowsDefaultCellStyle.BackColor = Color.Silver
    4. dgv2.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray
    5. 'Entfernt die Spalten
    6. dgv2.Columns.Remove("id")
    7. dgv2.Columns.Remove("time")
    8. dgv2.Columns.Remove("log")
    9. 'Erstellt neue Spalten im Datagridview
    10. Dim tbc1 As New DataGridViewTextBoxColumn
    11. Dim tbc2 As New DataGridViewTextBoxColumn
    12. Dim tbc3 As New DataGridViewTextBoxColumn
    13. 'Gibt die Quelle an
    14. tbc1.DataPropertyName = "id"
    15. tbc2.DataPropertyName = "time"
    16. tbc3.DataPropertyName = "log"
    17. 'Bestimmt den Text, der über die Spalte zu sehen ist.
    18. tbc1.HeaderText = "ID"
    19. tbc2.HeaderText = "Zeit"
    20. tbc3.HeaderText = "Nachricht"
    21. 'Bestimmt die Größe der Spalte, die angezeigt wird.
    22. tbc1.Width = 55
    23. tbc2.Width = 150
    24. tbc3.Width = 705
    25. 'Reihenfolge im Datagridview
    26. tbc1.DisplayIndex = 1
    27. tbc2.DisplayIndex = 2
    28. tbc3.DisplayIndex = 3
    29. 'Fügt die Spalten hinzu.
    30. dgv2.Columns.Add(tbc1)
    31. dgv2.Columns.Add(tbc2)
    32. dgv2.Columns.Add(tbc3)
    33. End Sub


    Jetzt wird in dem Datagridview zum einen die ID sowie die Log-Nachricht angezeigt, aber zum anderen auch die Zeit. Allerdings in der Timestamp-Konventierung.

    Jetzt möchte ich Inhalt der "Time"-Spalte nicht direkt in das Datagridview einfügen, sondern erst den Wert in das normale Datum zurück konventieren.

    VB.NET-Quellcode

    1. GetTimestamp.GetDateFromTimestamp(Timestamp-Wert)
    2. 'Gibt den Wert des Datums zurück mittels DLL.


    Dabei brauche ich Hilfe, weil ich nicht weiß, wie ich da ran gehen soll. Geht es überhaupt?

    Gruß, Dennis

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

    formatierung zeile 38

    VB.NET-Quellcode

    1. dgv2.Columns.Add(tbc2)


    ändern in

    VB.NET-Quellcode

    1. dgv2.Columns.Add(GetDateFromTimestamp
    2. (tbc2))


    sollte gehen wenn

    VB.NET-Quellcode

    1. GetDateFromTimestamp


    so funktioniert :

    echtezeit=GetDateFromTimestamp(timestampzeit)
    Danke für deine Hilfe, aber es funktioniert so leider nicht.
    Lib:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class timestamp
    2. Function GetTimestamp(ByVal FromDateTime As DateTime) As Integer
    3. Dim Startdate As DateTime = #1/1/1970#
    4. Dim Spanne As TimeSpan
    5. Spanne = FromDateTime.Subtract(Startdate)
    6. Return CType(Math.Abs(Spanne.TotalSeconds()), Integer)
    7. End Function
    8. Function GetDateFromTimestamp(ByVal unixTimestamp As Integer) As DateTime
    9. Dim Span As TimeSpan
    10. Dim Startdate As Date = #1/1/1970#
    11. If unixTimestamp = 0 Then Return Startdate
    12. Span = New TimeSpan(0, 0, unixTimestamp)
    13. Return Startdate.Add(Span)
    14. End Function
    15. End Class


    VB.NET-Quellcode

    1. Imports timestamp

    VB.NET-Quellcode

    1. Dim GetTimestamp As New timestamp.timestamp

    VB.NET-Quellcode

    1. dgv2.Columns.Add(GetTimestamp.GetDateFromTimestamp(tbc2))

    "Der Wert vom Typ "System.Windows.Forms.DataGridViewTextBoxColumn" kann nicht in "Integer" konvertiert werden."

    Funktion:

    VB.NET-Quellcode

    1. RichtigeZeit = GetTimestamp.GetDateFromTimestamp(Timestampzeit)


    Gruß, Dennis
    teste mal

    VB.NET-Quellcode

    1. dgv2.Columns.Add(GetTimestamp.GetDateFromTimestamp(tbc2).tostring)

    oder

    VB.NET-Quellcode

    1. dgv2.Columns.Add(GetTimestamp.GetDateFromTimestamp(tbc2.tostring).tostring)

    oder

    VB.NET-Quellcode

    1. dgv2.Columns.Add(GetTimestamp.GetDateFromTimestamp(tbc2.tostring))

    glaube das letzte
    Fehler bei:

    VB.NET-Quellcode

    1. strTest = DirectCast(GetTimestamp.GetDateFromTimestamp(tbc2), String)

    Der Wert vom Typ "System.Windows.Forms.DataGridViewTextBoxColumn" kann nicht in "Integer" konvertiert werden. (tbc2)

    VB.NET-Quellcode

    1. dgv2.Columns.Add(strTest)

    Der Wert vom Typ "String" kann nicht in "System.Windows.Forms.DataGridViewColumn" konvertiert werden. (strTest)

    Fehler direkt im Codefenster, nicht im debuggen.

    Komm schon Leute, nicht aufgeben ;)


    Gruß, Dennis
    Dann ist tbc2 als DataGridViewColumn deklariert ... das kann natürlich mal gar nicht funzen. ^^

    Du kannst nicht eine komplette DataGrid-Column umwandeln. Du brauchst den Cell.Value der Column für die entsprechende Row die Du auslesen willst. ;)

    Gruß

    Rainer
    Für den Code im Opener-Post passt die Deklaration schon. Aber dort werden ja auch keine Datensätze eingelesen, sondern nur die Columns/Spalten des DataGridViews erstellt.

    In dem Code kannst du keine Umwandlung vornehmen. Du kannst die Umwandlung erst vornehmen wenn die Datensätze im DataGridView drinnen sind oder wenn Du Sie selber direkt per Code einfügst dann dabei.

    Zum Beispiel so nach der Befüllung des DataGridViews mit den Daten:

    VB.NET-Quellcode

    1. Dim intCheck As Integer
    2. '// jede Datenzeile abarbeiten
    3. For Each Row As DataGridViewRow In Me.DataGridView1.Rows
    4. '// aus jeder Datenzeile mit der Zelle der Spalte "TimeStamp" arbeiten
    5. With Row.Cells(2) '// 2 = Index der Spalte mit dem TimeStamp-Wert
    6. '// Zellen-Value als Integer abspeichern
    7. intCheck = DirectCast(.Value, Integer)
    8. '// Zellen-Value neu mit Rückgabe aus TS-Umwandlungsfunktion bestücken, dabei explizite Umwandlung in String
    9. .Value = DirectCast(GetTimestamp.GetDateFromTimestamp(intCheck), String)
    10. End With
    11. Next


    So sollte es eigentlich funktionieren ... mal rein theoretisch und aus dem Bauch raus. ^^

    Gruß

    Rainer
    Eingangs sagtest du, du wollest Unix-Timestamps als normale DateTimes formatiert anzeigen.
    Dann solltest du auch das DGV-CellFormatting - Event verwenden.
    Dort bekommst du in den EventArgs den Wert einer Zelle, wie er tatsächlich ist, und kannst ihn ändern, sodasser anders angezeigt wird.
    Musst halt sicherstellen, dass deine Formatierung auch nur auf die Zellen der richtigen Spalte angewandt werden, und in diesem Falle dann auch e.FormattingApplied = True setzen.
    Danke, aber funktioniert noch immer nicht.

    VB.NET-Quellcode

    1. Private Sub DataGridView1_CellFormatting(ByVal sender As Object, ByVal e As System.Windows.Forms.DataGridViewCellFormattingEventArgs) Handles DataGridView1.CellFormatting
    2. e.FormattingApplied = True
    3. Dim intCheck As Integer
    4. For Each Row As DataGridViewRow In Me.DataGridView1.Rows
    5. With Row.Cells(2)
    6. intCheck = DirectCast(.Value, Integer)
    7. .Value = GetTimestamp.GetDateFromTimestamp(intCheck).ToString
    8. End With
    9. Next
    10. End Sub

    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub formatdatagridcomputer(ByVal dgv2 As DataGridView)
    2. dgv2.RowsDefaultCellStyle.BackColor = Color.Silver
    3. dgv2.AlternatingRowsDefaultCellStyle.BackColor = Color.LightGray
    4. dgv2.Columns.Remove("id")
    5. dgv2.Columns.Remove("time")
    6. dgv2.Columns.Remove("log")
    7. Dim tbc1 As New DataGridViewTextBoxColumn
    8. Dim tbc2 As New DataGridViewTextBoxColumn
    9. Dim tbc3 As New DataGridViewTextBoxColumn
    10. tbc1.DataPropertyName = "id"
    11. tbc2.DataPropertyName = "time"
    12. tbc3.DataPropertyName = "log"
    13. tbc1.HeaderText = "ID"
    14. tbc2.HeaderText = "Zeit"
    15. tbc3.HeaderText = "Nachricht"
    16. tbc1.Width = 55
    17. tbc2.Width = 150
    18. tbc3.Width = 705
    19. tbc1.DisplayIndex = 0
    20. tbc2.DisplayIndex = 1
    21. tbc3.DisplayIndex = 2
    22. dgv2.Columns.Add(tbc1)
    23. dgv2.Columns.Add(tbc2)
    24. dgv2.Columns.Add(tbc3)
    25. End Sub


    Wieso funktioniert das denn nicht? :(

    Gruß, Dennis
    Bilder
    • screenshot_vb_ta.png

      176,75 kB, 1.600×900, 152 mal angesehen
    das CellFormatting beschäftigt sich nur mit der Formatierung genau einer Zelle.
    Es macht also keinen Sinn, da in einer Schleife alle Rows durchzugehen, sondern du mußt als erstes die angefragte Zelle identifizieren, und dann entscheiden, ob das überhaupt eine Zelle ist, die du formatieren willst.
    Erst dann auch formatieren, und e.FormattingApplied auf True setzen.

    Beachte: das ist ein anderer Ansatz, da kannstenicht unbedingt Codevorschläge von anderen Ansätzen einfach einpasten oderso.

    ErfinderDesRades schrieb:

    Es macht also keinen Sinn, da in einer Schleife alle Rows durchzugehen, sondern du mußt als erstes die angefragte Zelle identifizieren, und dann entscheiden, ob das überhaupt eine Zelle ist, die du formatieren willst.
    Das heißt, dass ich beim Aufruf nicht sofort alle Zeilen der Spalte "time" in konventieren kann?