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
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:
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.
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):
VB.NET-Quellcode
- <System.Diagnostics.DebuggerStepThrough()> _
- Private Sub InitializeComponent()
- Me.components = New System.ComponentModel.Container()
- Dim TestBindingSource As System.Windows.Forms.BindingSource
- Me.TestDataGridView = New System.Windows.Forms.DataGridView()
- Me.Column2 = New System.Windows.Forms.DataGridViewTextBoxColumn()
- TestBindingSource = New System.Windows.Forms.BindingSource(Me.components)
- CType(TestBindingSource, System.ComponentModel.ISupportInitialize).BeginInit()
- CType(Me.TestDataGridView, System.ComponentModel.ISupportInitialize).BeginInit()
- Me.SuspendLayout()
- '
- 'TestBindingSource
- '
- TestBindingSource.AllowNew = False
- TestBindingSource.DataSource = GetType(WindowsApp4.Test)
- '
- 'TestDataGridView
- '
- Me.TestDataGridView.AutoGenerateColumns = False
- Me.TestDataGridView.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize
- Me.TestDataGridView.Columns.AddRange(New System.Windows.Forms.DataGridViewColumn() {Me.Column2})
- Me.TestDataGridView.DataSource = TestBindingSource
- Me.TestDataGridView.Dock = System.Windows.Forms.DockStyle.Fill
- Me.TestDataGridView.Location = New System.Drawing.Point(0, 0)
- Me.TestDataGridView.Name = "TestDataGridView"
- Me.TestDataGridView.Size = New System.Drawing.Size(331, 248)
- Me.TestDataGridView.TabIndex = 1
- '
- 'Column2
- '
- Me.Column2.DataPropertyName = "Text"
- Me.Column2.HeaderText = "Column2"
- Me.Column2.Name = "Column2"
- '
- 'Form1
- '
- Me.AutoScaleDimensions = New System.Drawing.SizeF(6.0!, 13.0!)
- Me.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font
- Me.ClientSize = New System.Drawing.Size(331, 248)
- Me.Controls.Add(Me.TestDataGridView)
- Me.Name = "Form1"
- Me.Text = "Form1"
- CType(TestBindingSource, System.ComponentModel.ISupportInitialize).EndInit()
- CType(Me.TestDataGridView, System.ComponentModel.ISupportInitialize).EndInit()
- Me.ResumeLayout(False)
- 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.
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.
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“ ()