Datagridview Columns.count

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

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Datagridview Columns.count

    Hallo Ihr wissenden,

    ich möchte ein DataGridview einer Form hinzufügen und es vorher dynamisch formatieren.

    VB.NET-Quellcode

    1. Dim dg As DataGridView
    2. Dim dt As New DataTable
    3. '... Code zum Füllen der Datentabelle
    4. dg.DataSource = dt
    5. msgbox(dt.columns.count & " | " & dg.columns.count) '<<-- keine Übereinstimmung
    6. MyForm.Controls.add(dg)
    7. msgbox(dt.columns.count & " | " & dg.columns.count) '<<--- stimmt überein und ich könnte die einzelnen Spalten ansprechen


    bei der ersten Msgbox wird die richtige Anzahl der Spalten der DataTable ermittelt aber die Anzahl der Spalten des DataGridView bleibt weiterhin auf 0.
    Erst wenn ich das Datengridview der Form hinzufüge wird die Anzahl der Spalten des DataGridView erkannt und ich könnte entsprechend die einzelnen Spalten formatieren.

    Ich würde aber die Spalten des DataGridView formatieren, bevor ich es der Form hinzufüge. Wie wäre dies möglich?

    Lieben Gruß,
    Chris
    Ich weiß nicht ob ich dich richtig verstehe, aber nach kurzem Test:

    VB.NET-Quellcode

    1. Dim dg As New DataGridView
    2. dg.ColumnCount = 15
    3. Console.WriteLine(dg.Columns.Count)
    4. Panel1.Controls.Add(dg)
    5. Console.WriteLine(dg.Columns.Count)


    Ergibt beides 15. Wo erstellst du denn das Objekt? Dim dg as Datagridview legt nur fest, dass du eine Variable vom Typ Datagridview hast, da kannst du nicht abfragen wie viele Spalten es hat. Mit Dim dg As New DataGridView erstellst du direkt ein Objekt vom Typ DataGridview dem du auch spalten hinzufügen kannst obwohl es nicht sichtbar ist/sich in einem Panel befindet.
    Option strict = on

    If it's stupid and it works it ain't stupid.
    Vielen Dank für deine Antwort.

    Das DatenGridview wird in einer Funktion erstellt und anschließend eingebunden. Ich habe dir das mal nachgebastelt zum besseren Verständnis.
    Ich gebe dir recht, wenn ich vorher über ColumnCount festlege, dass das Datagridview z.B. 15 Spalten hat. Dann kann ich die Anzahl der Spalten abrufen.
    Aber mein DatenGridview zeigt die Daten aus einer DataTable an, dessen Inhalt vom SQL Server kommt. Obwohl die Datentabelle z.B. 15 Spalten hat kann ich vor dem einbinden in eine Form nicht die Anzahl der Spalten des DatenGridview auszählen. Ich mächte es deshalb auslesen, da ich z.B. die erste Spalte anders formatieren möchte.


    So sieht der Code aus.

    VB.NET-Quellcode

    1. Private Function _DataGridErstellen(ByVal SQLString As String) as Datagridview
    2. Dim dg As New DataGridView With {.RowHeadersVisible = False, _
    3. .ColumnHeadersVisible = True, _
    4. .SelectionMode = DataGridViewSelectionMode.FullRowSelect, _
    5. .MultiSelect = False, _
    6. .AllowDrop = False, _
    7. .AllowUserToAddRows = False, _
    8. .AllowUserToOrderColumns = False, _
    9. .AllowUserToResizeColumns = False, _
    10. .AllowUserToResizeRows = False, _
    11. .ScrollBars = ScrollBars.None, _
    12. .BorderStyle = BorderStyle.None, _
    13. .ForeColor = Color.White, _
    14. .CellBorderStyle = DataGridViewCellBorderStyle.SingleHorizontal, _
    15. .EnableHeadersVisualStyles = False, _
    16. .ColumnHeadersBorderStyle = DataGridViewHeaderBorderStyle.None}
    17. 'Daten werden vom SQL Server in die Datentabelle geladen
    18. Dim SQL_Connection As New SqlConnection(SQL_DB.ConnectionString)
    19. Dim SQL_Cmd As New SqlCommand(SQLString, SQL_Connection)
    20. SQL_Connection.Open()
    21. Dim reader As SqlDataReader = SQL_Cmd.ExecuteReader()
    22. Dim dt As New DataTable
    23. dt.Load(reader)
    24. SQL_Connection.Close()
    25. With dg
    26. .DataSource = dt
    27. MyForm.Label1.Text = .Columns.Count & " | " & dt.Columns.Count '<<< Ergibt 0 | 15
    28. .Columns(1).DefaultCellStyle.Alignment = DataGridViewContentAlignment.MiddleLeft ' <<<--- Funktioniert z.B. nicht da die Spalte 1 außerhalb des Indexes liegt. Nach dem einbinden funktioniert es.
    29. End With
    30. Return dg
    31. end function
    32. Private Sub LoadMyForm()
    33. Dim SQLCode as String = "..."
    34. me.controls.add(_DataGridErstellen(SQLCode))
    35. End sub

    Hotdogxxxx schrieb:

    Das DatenGridview wird in einer Funktion erstellt und anschließend eingebunden.
    Was soll das?
    Gibt es eine Situation, in der sdiese Form aufgerufen wird, aber kein DGV dargestellt wird?
    Falls Nein: Zieh Dir das DGV im Designer auf die Form und gib ihm dort Properties.
    Dynamische Daten kommen in eine DataTable und dieses wird dem DGV als DataSource zugewiesen.
    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!
    Ja genau das ist der Grund: Je nachdem welche Daten vom Server abgerufen werden ist es erforderlich ein oder mehrere DatenGridviews zu erstellen und der Form hinzuzufügen. Wenn ich alles im Designer erstellen würde, wäre der Code ziemlich schnell unübersichtlich. Im Grunde ändert sich eben immer nur der AbfrageString. Daher ist das erstellen des DatenGridviews in eine Funktionen ausgelagert und das DatenGridView wird eben mit dem AbfrageString hinzugefügt wenn es benötigt wird. Daher möchte ich diese eben auch in der Funktion gleich formatieren, damit beim Einbinden "das fertige" DatenGridview an die entsprechende Stelle geladen wird.

    Hotdogxxxx schrieb:

    und der Form hinzuzufügen
    Sind die alle auf dieser Form oder könnten die auch auf einem TabControl liegen?
    Dann könntest Du eine TabPage / UserControl designen und bei jeder neuen Datenbank wird einfach ein neuer Tab hinzugefügt und feddich.
    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!