Array zu Datagridview hinzufügen

  • VB.NET
  • .NET 4.5

Es gibt 8 Antworten in diesem Thema. Der letzte Beitrag () ist von SpaceyX.

    Array zu Datagridview hinzufügen

    Hallo Zusammen,

    ich habe nochmal ein kleines Problem.

    Ich habe ein Array mit Zahlenwerten und würde dies gerne in einer Datagridview anzeigen lassen. (Bitte nicht anfangen mit mach es über Dataset/Datatable... ;) )

    Ich habe jetzt das Problem, dass das Array dynamisch sein kann. Das können heute eine Dimension von 10 und morgen von 15 haben.
    Meine Datagridview wird dynamisch erstellt und das Array wird ebenfalls dynamisch erstellt.

    mObj ist mein Array von Typ integer und wird übergeben:

    VB.NET-Quellcode

    1. Dim i As Integer
    2. Dim anz As Integer
    3. Dim tblstr() As String = {}
    4. anz = mObj.length - 1
    5. ReDim tblstr(anz + 1)
    6. For i = 0 To anz
    7. tblstr(i + 1) = Convert.ToString(mObj(i))
    8. Next
    9. tblstr(0) = convert.ToString(IDK)
    10. DirectCast(cForm.Controls(CoName), DataGridView).Rows.Add(tblstr)

    Ich schiebe mein Int-Array in ein String-Array und schiebe das in eine Datagridview.

    Wenn ich das so laufen lasse, funktioniert es und in der Tabelle wird alles richtig angezeigt.
    Allerdings habe ich dann das Problem, dass wenn ich nach einer Spalte sortiere, wird alphanumerisch sortiert, weil ich eine Zeichenkette übergebe.

    Mache ich das ganze als Integer, funktioniert das Anzeigen in der Datagridview nicht und in der ersten Spalte steht nur "Int32".

    Habt ihr da eine Idee, wie ich das Problem lösen kann?

    Leider kann ich nicht auf ein Dataset oder eine Datatable umstellen und muss mit den gegebenen Mitteln arbeiten...

    Lange Rede kurzer Sinn: Ich würde gerne ein Integer Array möglichst einfach und dynamisch in eine Datagridview schieben.
    Sowas wie .Add(Arr(0),Arr(1),Arr(2)...) funktioniert leider nicht, da die Anzahl immer Variabel ist.

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

    Für solch dynamische Sachen gibt es die List(Of T) und die BindingSource. Die List(Of T) ist dein dynamisches Array, und die BindingSource sorgt dafür, dass das DataGridiew mitbekommt, wenn sich etwas in der Liste ändert. Alternativ könntest du es auch mit einer BindingList(Of T) versuchen, was afaik die BindingSource überflüssig macht.

    Generell braucht man in .NET Arrays überaus selten, wenn man nicht gerade mit Datenströmen arbeitet.
    List(Of T) ersetzen die klassischen Arrays beinahe restlos.

    Edit:
    @LassMichInRuhe Ich sehe gerade, du benutzt Convert.ToString um ein Int in einen String zu überführen. Absolut jedes Objekt in .NET verfügt über eine Methode namens .ToString(). Für alle Zahlentypen ist diese Methode so definiert, dass sie den momentanen Wert der Variablen als String zurückgibt. Nicht das Convert.ToString etwas anderes machen würde, vmtl. ist es nur ein geschachtelter aufruf von .ToString() deiner Variablen, jedoch ist es schlichtweg unnötig.
    Post-AGB:
    §1 Mit dem Lesen dieses Posts stimmst du den AGB unverzüglich zu
    §2 Ein Widerruf muss innerhalb von 3 Sekunden nach Lesen des Hauptbestandteil des ersten jemals gelesenen Posts erfolgen
    Abs.1 Die Signatur zählt nicht zum Hauptbestandteil des Posts
    §3 Ein erfolgreicher Widerruf zwingt zu einem Besuch bei einem Hypnotiseur oder Neurochirurg, sodass der gelesene Text aus den Erinnerungen entfernt werden kann
    Abs.1 Die Kosten und Risiken sind jeweils selbst zu tragen

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

    Zahlen in die DGV reinzubringen ist gar nicht so einfach. Object hingegen sollten gehen.


    Ich würde ungefähr so vorgehen.
    - Erstelle vorab in deiner DGV eine Column mit einem Name z.B. Values oder so
    - Nimm eine X-beliebige Integer-Array (Ja. Darf eine Array sein)
    - Clear deine DGV.Rows
    - Mit einer For Each durch deine Array in die DGV.Rows.Add jedoch als new Object(){ArrayItem}

    VB.NET-Quellcode

    1. Array.ForEach(mObj, Sub(x) Me.DataGridView1.Rows.Add({x}))


    Sollte funktionieren.

    Freundliche Grüsse

    exc-jdbi

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „exc-jdbi“ ()

    Mal versucht das Integer Array direkt (nix ToString)als DataSource ans DataGrid zu hängen? Hab ich nich nie gemacht, mit ner List(Of T) geht das, nen Versuch wäre es also Wert :)
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen
    Bei mir will das mit der ListOfT nicht gehen. Schreibt mir nur den Typ in eine Zelle.
    Mach ich hingegen was eigenes einen eigenen Datentyp (also ne Klasse z.B.) dann geht es wiederum.

    Mit einer ListOfString geht es halbwegs. Aber es sortiert dann auch alphanumerisch.

    Freundliche Grüsse

    exc-jdbi
    Hi. Eine List(Of Integer) kann nicht gehen, da der Integer Datentyp keine Properties hat, die als Columns verwendet werden können.

    Die eleganteste Lösung ist, die Daten in eine Klasse zu stecken. Ich verstehe nicht so recht, warum das ein Problem sein sollte. Auch verstehe ich nicht, warum man sich keine DataTable anlegen kann, somit würde man die Sortierfunktion gratis dazu bekommen.

    Wenn beide Ansätze nicht möglich sind, dann bleibt das:

    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim x As New List(Of Nullable(Of Integer))
    3. x.Add(10)
    4. x.Add(20)
    5. x.Add(30)
    6. Me.DataGridView1.DataSource = x
    7. End Sub


    Der Nullable Datentyp hat eben Properties, die als Columns verwendet werden können. Aber man kann dann auch gleich eine eigene Klasse nehmen.

    Fazit. List(Of Integer) kann nicht gehen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    How to turn OPTION STRICT ON
    Why OPTION STRICT ON
    Sortieren lässt sich alles, hängt davon ab, wie man es sortiert. Wie gesagt, bindet man eine DataTable per BindingSource an das DGV, erhält man die Sortierfunktion gratis, alles andere, was nicht IBindingLIst implementiert, muss selber sortiert werden, soweit ich das begriffen habe.

    Die Sort-Funktion des DGV funktioniert jedenfalls so nicht, wie es das gegebene Problem darstellt, also muss man selber ran.

    VB.NET-Quellcode

    1. Imports System.ComponentModel
    2. Public Class Form1
    3. Private _data As New List(Of Nullable(Of Integer))
    4. Private _currentOrder As ListSortDirection = ListSortDirection.Ascending
    5. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    6. _data.Add(10)
    7. _data.Add(20)
    8. _data.Add(30)
    9. Me.DataGridView1.DataSource = _data
    10. End Sub
    11. Private Sub SortDGV(sortDirection As ListSortDirection)
    12. If sortDirection = ListSortDirection.Ascending Then
    13. _data = _data.OrderBy(Function(x) x.Value).ToList()
    14. Else
    15. _data = _data.OrderByDescending(Function(x) x.Value).ToList()
    16. End If
    17. Me.DataGridView1.DataSource = _data
    18. End Sub
    19. Private Sub DataGridView1_ColumnHeaderMouseClick(sender As Object, e As DataGridViewCellMouseEventArgs) Handles DataGridView1.ColumnHeaderMouseClick
    20. _currentOrder = If(_currentOrder = ListSortDirection.Ascending, ListSortDirection.Descending, ListSortDirection.Ascending)
    21. SortDGV(_currentOrder)
    22. End Sub
    23. End Class


    Sowas in der Art würde ich dann machen.
    Die Unendlichkeit ist weit. Vor allem gegen Ende. ?(
    Manche Menschen sind gar nicht dumm. Sie haben nur Pech beim Denken. 8o

    How to turn OPTION STRICT ON
    Why OPTION STRICT ON