Classe für DatagriedView Form zeigt nicht Datasource

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von Edwardschn.

    Classe für DatagriedView Form zeigt nicht Datasource

    Ich weiss nicht was dem Tier fehlt.
    Kuck ich am Schluss in das Datagried und lass mir den Inhalt von Datasource anzeigen, dann ist es aufgeladen mit der Tabelle.
    Aber im Form wird nichts angezeigt, Das Datagried bleibt leer.

    Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim ClsDGV As New ClsDGV
    3. 'hier steht der Code der dt aufLaedt,
    4. 'lass ich wegen übersicht weg
    5. ClsDGV.FillDGV(dt)
    6. Me.DataGridView1 = ClsDGV.GetDGV
    7. Me.Refresh()
    8. End Sub
    9. Public Class ClsDGV
    10. Private myDGV As DataGridView
    11. Private bolHasChangedAs Boolean
    12. Public Sub New()
    13. myDGV = New DataGridView
    14. End Sub
    15. Public Function GetDGV() As DataGridView
    16. Return Me.myDGV
    17. End Function
    18. Private Sub DGVRowChanged(ByVal sender As Object, ByVal e As DataGridViewRowStateChangedEventArgs)
    19. Me.bolHasChanged= True
    20. End Sub
    21. Public Property SetDGV() As DataGridView
    22. Get
    23. Return Me.myDGV
    24. End Get
    25. Set(ByVal WithEventsValue As DataGridView)
    26. Dim handler2 As DataGridViewRowStateChangedEventHandler = New DataGridViewRowStateChangedEventHandler(AddressOf Me.DGVRowChanged)
    27. If (Not Me.myDGV Is Nothing) Then
    28. RemoveHandler Me.myDGV.RowStateChanged, handler2
    29. End If
    30. Me.myDGV = WithEventsValue
    31. If (Not Me.myDGV Is Nothing) Then
    32. AddHandler Me.myDGV.RowStateChanged, handler2
    33. End If
    34. End Set
    35. End Property
    36. Public Sub FillDGV(ByRef dt As DataTable)
    37. With SetDGV
    38. SetDGV.DataSource = dt
    39. End With
    40. End Sub
    41. End Class

    Edwardschn schrieb:

    VB.NET-Quellcode

    1. Public Sub FillDGV(ByRef dt As DataTable)
    2. With SetDGV
    3. SetDGV.DataSource = dt
    4. End With
    5. End Sub
    Doppelt gemoppelt.
    ------------------------
    Ichj würde die DataSource Me.DataGridView1 zuweisen.
    In der Summe, wie @xtts02: : Schmeiß die Klasse ClsDGV raus.
    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!

    xtts02 schrieb:

    Erlaube mir bitte die Frage: Wozu soll diese Klasse gut sein?


    Hi xtts02, mach ich gerne.
    (betrifft normales Handling also DatagriedView.Datasource = dt)
    User kommen manchma auf die unmöglichsten ideen, z.B. Buchstaben in ein Feld eintragen, das nur Zahlen erlaubt. Wenn User jetzt den Curser aus der Zeile im Datagriedview nimmt,
    kommt eine Errormessage(weiss jetzt nicht genau was da steht) sinngemäss etwa: nur Zahlen erlaubt. Das erschlisst sich aber nur 'uns' dem normalen User sagte diese Message meisst nichts. Und lässt sich auch nicht per Try Catch abfangen.

    Mit dieser Classe kann ich aber per 'DataGridViewRowStateChangedEventHandler ' auf eine Änderung des User regaieren, bevor er per Maus oder sonstwie das Gried verlässt

    Edwardschn schrieb:

    User kommen manchma auf die unmöglichsten ideen, z.B. Buchstaben in ein Feld eintragen, das nur Zahlen erlaubt.

    Dann ist es doch besser, Du leitest Dir Deine eigene DGV-Column-Klasse von System.Windows.Forms.DataGridViewColumn ab.
    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!
    Es lässt sich vielleicht auch so machen, aber ich komm nicht an den geändert wert.
    Das Ereignis das ich zuerst nehmen wollte, weil es sich vom Namen her anbietet 'CellValueChanged' geht hier nicht, wird vom FormatedException quasi überholt.
    Die beiden Ereignisse CellLeave und RowLeave werden vorher duchgelassen, aber ich komm nicht an den neu eingetragenen wert.



    Quellcode

    1. Public Class Form2
    2. Private Sub DGVRowChanged(ByVal sender As Object, ByVal e As DataGridViewCellEventArgs) Handles DataGridView1.CellLeave
    3. Dim DgRow As DataGridViewRow
    4. Dim myDataRowViewAs DataRowView = Nothing
    5. Dim myDataRowAs DataRow = Nothing
    6. DgRow = DataGridView1.Rows.Item(e.RowIndex)
    7. myDataRowView= DirectCast(DgRow.DataBoundItem, DataRowView)
    8. myDataRow= MyRowView.Row
    9. MessageBox.Show("DGVRowChanged = " & MyRow.Item(e.ColumnIndex))
    10. End Sub
    11. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    12. Dim dt As New DataTable
    13. 'Load DataTable
    14. With dt
    15. With .Columns
    16. With .Add("ID", GetType(Integer))
    17. .AutoIncrement = True
    18. .AutoIncrementStep = -1
    19. .AutoIncrementSeed = -1
    20. End With
    21. .Add("col1", GetType(String))
    22. .Add("col2", GetType(Double))
    23. End With
    24. 'Data
    25. For i = 1 To 2
    26. .Rows.Add(dt.NewRow)
    27. With .Rows(.Rows.Count - 1)
    28. .Item("col1") = "Row " & i.ToString
    29. .Item("col2") = Rnd()
    30. End With
    31. Next
    32. End With
    33. Me.DataGridView1.DataSource = dt
    34. End Sub
    35. End Class
    was willst du vom neu eingetragenen Wert?

    Ihn speichern?

    Da gehe doch besser gleich nach "Datenbank in 10 Minuten" auf Movie-Tuts vor, weil da bekommst du einen Button, mit dem du alles speichern kannst - und zwar nur die Änderungen werden an die DB gesandt - das merkt der sich automatisch.

    Auf diese Weise brauchst du nicht den neu eingetragenen Wert, sondern - klick auf Save-Button - und alle neu eingetragenen Werte sind insgesamt inne DB.