WinForms-Designer zeigt ungewollt automatisch Spalten in einem gebundenen DGV [gelöst]

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

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

    WinForms-Designer zeigt ungewollt automatisch Spalten in einem gebundenen DGV [gelöst]

    Hallo zusammen.

    Anbei ein Testprojekt (erstellt in VS2019CE) mit einem nervtötenden Problem.
    Ich habe eine BindingSource an eine eigene Klasse gebunden und ein DGV an diese BindingSource. (Daher muss man erstmal das Projekt kompilieren, damit man fehlerfrei in den Form1-Designer reinkommt.) Darin habe ich eine Spalte (beschriftet mit "Column2"), die an die einzige Property "Text" der gebundenen Klasse gekoppelt ist. Wenn ich den WinForms-Designer schließe und wieder öffne, erscheint eine zusätzliche Spalte "Text", die ebenfalls an die Text-Property gebunden ist.


    Das ist aber nicht in der Designer.VB zu sehen/hinterlegt (z.B. Zeile#21):
    Spoiler anzeigen

    VB.NET-Quellcode

    1. <System.Diagnostics.DebuggerStepThrough()> _
    2. Private Sub InitializeComponent()
    3. Me.components = New System.ComponentModel.Container()
    4. Dim TestBindingSource As System.Windows.Forms.BindingSource
    5. Me.TestDataGridView = New System.Windows.Forms.DataGridView()
    6. Me.Column2 = New System.Windows.Forms.DataGridViewTextBoxColumn()
    7. TestBindingSource = New System.Windows.Forms.BindingSource(Me.components)
    8. CType(TestBindingSource, System.ComponentModel.ISupportInitialize).BeginInit()
    9. CType(Me.TestDataGridView, System.ComponentModel.ISupportInitialize).BeginInit()
    10. Me.SuspendLayout()
    11. '
    12. 'TestBindingSource
    13. '
    14. TestBindingSource.AllowNew = False
    15. TestBindingSource.DataSource = GetType(WindowsApp4.Test)
    16. '
    17. 'TestDataGridView
    18. '
    19. Me.TestDataGridView.AutoGenerateColumns = False
    20. Me.TestDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
    21. Me.TestDataGridView.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {Me.Column2})
    22. Me.TestDataGridView.DataSource = TestBindingSource
    23. Me.TestDataGridView.Dock = System.Windows.Forms.DockStyle.Fill
    24. Me.TestDataGridView.Location = New System.Drawing.Point(0, 0)
    25. Me.TestDataGridView.Name = "TestDataGridView"
    26. Me.TestDataGridView.Size = New System.Drawing.Size(331, 248)
    27. Me.TestDataGridView.TabIndex = 1
    28. '
    29. 'Column2
    30. '
    31. Me.Column2.DataPropertyName = "Text"
    32. Me.Column2.HeaderText = "Column2"
    33. Me.Column2.Name = "Column2"
    34. '
    35. 'Form1
    36. '
    37. Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
    38. Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
    39. Me.ClientSize = New System.Drawing.Size(331, 248)
    40. Me.Controls.Add(Me.TestDataGridView)
    41. Me.Name = "Form1"
    42. Me.Text = "Form1"
    43. CType(TestBindingSource, System.ComponentModel.ISupportInitialize).EndInit()
    44. CType(Me.TestDataGridView, System.ComponentModel.ISupportInitialize).EndInit()
    45. Me.ResumeLayout(False)
    46. End Sub



    Desweiteren wird automatisch die Neugenerierung von Spalten unterbunden (Z#19).
    Wenn ich die Spalte lösche, den Designer schließe und wieder öffne, taucht die Spalte wieder auf. Im MSDN gibt es zwar einen Hinweis, den ich nicht ganz verstehe:

    MSDN schrieb:


    Hinweis Setting the DataSource in the Windows Forms Designer automatically sets the AutoGenerateColumns property to false and generates code to add and bind a column for each property in the data source. The code that is generated at design-time is equivalent to the manually added code shown in the following example. It is not the same as the auto-generation of columns at run-time that occurs when the AutoGenerateColumns property is set to true.

    Nur das Blöde: Zur Laufzeit taucht die Spalte gar nicht auf!

    Ich würde die Autogenerierung ja verstehen, wenn man das DGV an eine BindingSource koppelt und dann alle gebundenen Spalten rauslöscht, da sich dann VS denkt: "Na, wozu koppelt er das DGV an ne BindingSource, wenn er doch keine gebundenen Spalten verwendet? Dann will der Programmierer bestimmt alle Spalten eingebunden haben." Aber ich hab ja schon ne Spalte an die Property gebunden.
    Kann jemand das Problem/Rätsel dieses Verhaltens erklären/lösen? Ansonsten melde ich das bei Mikrosaft - und ja, die kümmern sich tatsächlich manchmal um solche Dinge.




    Workaround in Post#5




    Das Problem wurde ab .NET 5 behoben.
    Dateien
    • WindowsApp4.zip

      (19,81 kB, 99 mal heruntergeladen, zuletzt: )
    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.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „VaporiZed“ ()

    @VaporiZed Gut, dass ich noch kein 19er Studio habe. ;)
    Im 17er Studio sieht die Form genau so aus wie bei Dir. Diese beiden Spalten sind allerdings auch im DGV-Spalten-Designer gelistet.
    In der Eyxe erscheint nur Column2, Spalte Text ist nicht zu sehen.
    Die Spalte erscheint und verschwindet mit der Zeile

    VB.NET-Quellcode

    1. TestBindingSource.DataSource = GetType(WindowsApp4.Test)
    im Designer.
    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, das heißt aber effektiv, dass es zwischen VS17 und 19 keinen Unterschied gibt. Denn über den DGV-Smarttag -> "Spalten bearbeiten" lösche ich ja die Text-Column wieder raus - auch wenn's ne Sisyphos-Arbeit ist, da sie ja nach Schließen und Wiederöffnen des Designers wieder auftaucht. Ist es denn bei VS17 in der Form1.Designer.VB zu sehen? Ich vermute nicht, da die Spalte ja dann zur Laufzeit auftauchen würde. Das ist ja mein Problem: Zur Designzeit zeigt sie sich, zur Laufzeit nicht. Ok, es beeinflusst nicht das laufende Programm, aber da sein sollte sie trotzdem nicht.
    Dass das Ganze mit der von Dir geposteten Zeile steht und fällt, ist mir bewusst, aber ich will ja die BindingSource an meine Klasse binden und später mit Daten (Objektinstanzen dieser Klasse) befüllen. Das ist ja auch von Mikrosaft so vorgesehen. Aber bitte nicht mit solchen Geisterspalten.

    ##########

    Das Problem kann ich umgehen (nicht lösen!), indem ich die Geisterspalte auf Visible = False setze - dann wird sie in der Designer.VB gelistet aber nicht mehr zur Designzeit angezeit. Lösche ich sie wieder raus, hab ich das alte Problem wieder. Also keine Lösung, nur Kaschierung.
    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.

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

    VaporiZed schrieb:

    Zur Designzeit zeigt sie sich, zur Laufzeit nicht.
    So ist es bei VS17 auch.
    Ist halt immer wieder lustig mit WinzigWeich & Co.
    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!
    Bin zwar mit Mikrosaft im Dialog und noch steht nicht fest, ob die das Problem beseitigen, aber ich fand zumindest eine Problemumgehung:
    Wenn ein DGV an einer DataSource hängt, erstellt VS automatisch Spalten, entsprechend der Datenquelle. Soweit so klar.
    Aber: Niemals all diese Spalten rauslöschen und durch "Spalten hinzufügen" neue, gebundene Spalten dazupacken. Mindestens eine der automatisch erstellten muss bleiben, sonst werden wieder alle Datenquellen-Spalten neu erstellt - auch wenn diese dann weder zur Laufzeit noch in der FormX.Designer.vb angezeigt werden. Dieses Geisterverhalten kann man zwar beseitigen, indem man eine Property jener Spalten oder deren Spaltenreihenfolgenposition im DGV ändert, aber trotzdem hat man dann wieder Spalten drin, die man doch gar nicht wollte.

    Zusammenfassend: Nie alle automatisch erstellten Spalten rauslöschen, sondern mindestens eine bestehen lassen und die so modifizieren, wie man sie braucht.
    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:

    Nie alle automatisch erstellten Spalten rauslöschen
    Jou. Die muss mann dann eben mit .Visible = False ausblenden.
    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!
    Nicht zwangsläufig. Bei nem datengebundenen DGV will man ja schon zumindest eine Spalte aus der Datenquelle haben, mit der man dann irgendwas zur Laufzeit macht - und sei es nur: anzeigen lassen. Daher muss man zumindest die eine automatisch generierte stehen lassen, die man haben will, aber eben nicht alles rauslöschen und selber wieder einfügen. Das ist der Knackpunkt, den man beachten muss. Hingegen gar keine Spalten der Datenquelle anzeigen? Da stellt sich dann wieder die Frage: Wozu überhaupt an eine Datenquelle binden? Es gibt zwar Situationen, in denen man die Datenquellen-Werte nicht direkt sichtbar haben will, sondern nur mit ihnen arbeiten will, aber ih glaube, dass man das dann auch anders hinbekommen kann.

    ##########

    Tja, Mikrosaft sieht es leider nicht als Bug an.
    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.

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

    Genau. Hab ich das so formuliert, dass das DGV weg muss? Hm
    Ich find auf Anhieb nur

    VaporiZed schrieb:

    Niemals all diese Spalten rauslöschen und durch "Spalten hinzufügen" neue, gebundene Spalten dazupacken. Mindestens eine der automatisch erstellten muss bleiben, sonst werden wieder alle Datenquellen-Spalten neu erstellt
    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.