Column eines generierten DataGridView ausblenden

  • VB.NET

Es gibt 14 Antworten in diesem Thema. Der letzte Beitrag () ist von Der_Gevatter.

    Column eines generierten DataGridView ausblenden

    Moin Forum,

    ich benötige leider Eure Hilfe / Unterstützung.

    In meinem Programm baue ich mir zur Laufzeit auf einem TabControl mehrere TabPages auf.
    Innerhalb einer TabPage baue ich mir eine DatagridView mit insgesamt 4 Spalten zusammen.
    Die erste Spalte soll ausgeblendet werden (visible = false).

    Leider steigt das Programm mit einer Fehlermeldung aus (siehe Screenshot).


    Ich komme einfach nicht weiter, um das Problem zu lösen.

    Hat Jemand einen Tipp oder Rat für mich?

    Mein Code:

    VB.NET-Quellcode

    1. Private Function NeuesTabErstellen(ByVal _parameter As CParameter) As TabPage
    2. Dim _tp As New TabPage
    3. Dim _param As New CParameter
    4. ' Name und Text des Tabs bestimmen
    5. Dim _anzahlTabs As Integer = TabParameter.TabCount + 1
    6. _tp.Name = "TabParam" + _anzahlTabs.ToString
    7. _tp.Text = "Parameter" + _anzahlTabs.ToString
    8. _tp.BorderStyle = BorderStyle.FixedSingle
    9. _tp.Tag = _param
    10. ' datatable
    11. Dim _dtParameter As New DataTable
    12. _dtParameter.Columns.Add("ParameterWert", GetType(CParameterwert))
    13. _dtParameter.Columns.Add("Nr", GetType(Integer))
    14. _dtParameter.Columns.Add("Bezeichnung", GetType(String))
    15. _dtParameter.Columns.Add("Wert", GetType(String))
    16. If _parameter IsNot Nothing Then
    17. ' Tabelle mit Leben füllen
    18. For Each _parameterwert As CParameterwert In _parameter.ParameterWerte
    19. _dtParameter.Rows.Add(_parameterwert, _parameterwert.Parameter_Nr, _parameterwert.Bezeichnung, _parameterwert.Wert)
    20. Next
    21. End If
    22. ' Datagridview aufbauen
    23. Dim _dgv As New DataGridView
    24. With _dgv
    25. .AllowUserToOrderColumns = True
    26. .AllowUserToResizeColumns = True
    27. .AllowUserToResizeRows = False
    28. .AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill
    29. .Dock = DockStyle.Fill
    30. .RowHeadersVisible = False
    31. .ReadOnly = False
    32. .SelectionMode = DataGridViewSelectionMode.FullRowSelect
    33. .DataSource = _dtParameter
    34. .Columns("ParameterWert").Visible = False
    35. End With
    36. _tp.Controls.Add(_dgv)
    37. Return _tp
    38. End Function
    @Der_Gevatter Die Spalte, die Du ansprichst, gibt es nicht.
    Hast Du den Namen richtig geschrieben?
    Hast Du diese Apalte bereits vorher gelöscht?
    Probierma, diese Spalte über ihren Index anzusprechen.
    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!
    @Der_Gevatter OK, dann musst Du mal selbst rauskriegen, was da wirklich Nothing ist.
    Lerne zu debuggen:
    Debuggen, Fehler finden und beseitigen
    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!
    Na Moment. Irgendwie werde ich das Gefühl nicht los, dass die DataTable zwar die Column enthält, das DGV aber noch nicht. Ich glaube, dass man das nicht in einem Atemzug (= in einer synchronen Prozedur) machen kann. Aber ausprobiert habe ich es nicht.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Die Schuppen und die Augen:

    Der_Gevatter schrieb:

    VB.NET-Quellcode

    1. Dim _dgv As New DataGridView
    Also:
    Dieses DGV enthält gar keine eigene Spalte, sondern nur eine DataTable als DataSource.
    Ich werde das mal nachstellen:
    _dgv.Columns.Count ist bei mir 0.
    ====
    Mit einer einfachen Tabelle ohne CParameter und CParameterwert funktioniert das.
    Form mit DGV und zwei Buttons:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private MyTable As DataTable
    3. Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    4. Me.MyTable = Me.InitDataTable()
    5. Me.InitData()
    6. End Sub
    7. Private Function InitDataTable() As DataTable
    8. Dim table = New DataTable("Sinus")
    9. ' für das DGV
    10. table.Columns.Add(New DataColumn("Coordinate", GetType(Double)))
    11. table.Columns.Add(New DataColumn("Value", GetType(Double)))
    12. Return table
    13. End Function
    14. Private Sub InitData()
    15. ' DataSource löschen
    16. Me.MyTable.Clear()
    17. Me.DataGridView1.DataSource = Nothing
    18. End Sub
    19. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    20. ' Hier werden die Daten bereitgestellt:
    21. Me.MyTable.Clear()
    22. For i As Integer = 0 To 100
    23. Dim newRow As DataRow = Me.MyTable.NewRow()
    24. newRow(0) = i
    25. newRow(1) = Math.Sin(i / 10)
    26. Me.MyTable.Rows.Add(newRow)
    27. Next
    28. Me.DataGridView1.DataSource = Me.MyTable
    29. Me.DataGridView1.Columns(1).DefaultCellStyle.Format = "0.0000"
    30. End Sub
    31. Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    32. Me.DataGridView1.Columns(1).Visible = Not Me.DataGridView1.Columns(1).Visible
    33. End Sub
    34. End Class


    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!

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

    Durch die Zuordnung der DataTable werden welche generiert. Aber wahrscheinlich nicht rechtzeitig.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    VaporiZed schrieb:

    Aber wahrscheinlich nicht rechtzeitig.
    Das hatte ich auch vermutet und das Ausblenden nach Außerhalb des With-Blockes verschoben.
    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

    soweit war ich auch schon.
    wenn das DataViewGrid auf die Form bzw. in das Tab gezeichnet wird, klappt alles bestens.

    Allerdings weiß ich erst zur Laufzeit des Programms, wie viele TabPages benötigt werden und daher erzeuge ich auch das DataGridView erst zur Laufzeit.
    Das Ausblenden nach dem With Block brachte leider auch nichts.

    Wenn ich die einzelnen Columns des DataGridViews "per Hand" erstelle, komme ich an dem Punkt nicht weiter, dass ich für CParameterwert kein DataGridViewColumn erstellen kann.
    @Der_Gevatter erstell mal ein UserControl mit DGV und füll das nur aus, und weise dessen Instanz der neuen TabPage zu.
    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!
    Das DGV muss erst dem Form als Control hinzugefügt werden, dadurch werden erst die Spalten tatsächlich erstellt, danach kann man auf diese zugreifen. Also: Post#1: Zeile#39 nach der #42 platzieren, allerdings eben vollqualifiziert.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Na Moment. _tp ist laut Post#1 und implizit bei Dir ja auch erst eine TabPage im Entstehen. Ich rede ja von zum-bereits-existierenden-und-angezeigten-Form-hinzufügen. Und das geht dann bei mir.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed Jou, nun schnackelt es.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub Button8_Click(sender As Object, e As EventArgs) Handles Button8.Click
    2. Dim cp = New CParameter
    3. With cp
    4. .ParameterWerte = New List(Of CParameterwert)
    5. Dim wert1 = New CParameterwert
    6. Dim wert2 = New CParameterwert
    7. .ParameterWerte.Add(wert1)
    8. .ParameterWerte.Add(wert2)
    9. End With
    10. Me.TabControl1.TabPages.Add(NeuesTabErstellen(cp))
    11. Dim _dgv As DataGridView = CType(Me.TabControl1.TabPages(2).Controls("bla"), DataGridView)
    12. _dgv.Columns("ParameterWert").Visible = False
    13. '_dgv.Columns(0).Visible = False
    14. End Sub
    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!