ich bin noch nicht so der Experte in WPF. Ich habe ein Datagrid, welches ich befülle. Beim erneuten Befüllen sind die Zeilen leer. Es zeigt mir zwar Zeilen an, aber eben nur leer. Auch die Spalten-Überschriften sind dann nicht mehr.
An was könnte das liegen?
Ich gebe hier möglichst viel Code mit, damit man sieht, was ich mache. Ich mache nix in XAML und möchte das in diesem Projekt auch nicht (das sollte auch nicht Ursache des Problems sein).
With dgrx .AutoGenerateColumns = True End With
Dim kvpValue As KeyValuePair(Of String, Value) Dim icData As ItemCollection = dgrx.Items Dim l As List(Of KeyValuePair(Of String, Value)) = New List(Of KeyValuePair(Of String, Value))
'Dim fNewValue As Single Dim usr As UnsignedRational Dim e() As UnsignedRational.Element
For Each kvpValue In ixExifInfo l.Add(item:=kvpValue) Next
With dgrx .ItemsSource = l .Items.Refresh() End With
Hier das Event AutoGeneratingColumn:
Private Sub dgrx_AutoGeneratingColumn(sender As Object, e As System.Windows.Controls.DataGridAutoGeneratingColumnEventArgs) Handles dgrx.AutoGeneratingColumn
Select Case e.Column.Header.ToString Case "Key" With e.Column .Header = "Name" End With
Case "Value" With e.Column .Header = "Wert" .IsReadOnly = False .CanUserSort = True .CanUserResize = True .CanUserReorder = True
End With Case Else e.Cancel = True End Select
End Sub
Wie gesagt, beim aller ersten Durchlauf nach Programmstart habe ich "Name" und "Wert" und auch die entsprechenden Werte.... Aber lade ich 'nen neuen Datensatz, läuft nix mehr.
So richtig verständlich ist der Code noch nicht. Man sieht nicht, wann der erste Teil aufgerufen wird. Außerdem werden da gleich 3 Variablen definiert, deren Verwendung Du nicht zeigst (icData, usr, e()). Und schließlich fehlt anscheinend der Code für das Hinzufügen neuer Datensätze (jedenfalls sieht mir der erste Teil eher nach einer initialen Befüllung aus).
Danke Matthias für die Formatierung. Der erste Teil wird quasi zum Befüllen mit Daten aufgerufen. Neue Datensätze werden zu keinem Zeitpunkt hinzugefügt. Mit With dgrx .ItemsSource = l wird die List als ItemsSource hinzugefügt. Es werden keine neuen Datensätze hinzugefügt. Irgendwann später werden komplett andere Datensätze angezeigt, und dafür wird exakt derselbe komplette Code nochmals aufgerufen. usr und e() sind in ausgeschnittenem Code, der meiner Meinung nicht relevant ist. Da wird nur vor dem l.Add(kvpValue) das kvpValue modifiziert, eher aus darstellerischen Gründen.
Ich hatte ein leeres Projekt aufgemacht, um das Problem vereinfacht beschreiben zu können, doch da trat es komischerweise nicht auf. Da der Code im Hauptprojekt auch noch recht übersichtlich ist, führte ich in stellenweise in Einzelschritten aus. Bis mir auffiel, dass "AutoColumnGenerating" (das ich jeweils mit einem Haltepunkt abfing) auch für bereits vorhandene Header aufgerufen wurde. Dh nach meinem Code-Beispiel aus der Frage hatte e.column.header.tostring beim neu zuweisen der Daten plötzlich zusätzlich auch Aufrufe mit "Name" und "Wert", die aber unter Case Else gecancelt wurden.
Oder anders: Mit diesem Code ist das Problem gelöst. (An den Feinheiten arbeite ich noch).
Private Sub dgrx_AutoGeneratingColumn(sender As Object, e As System.Windows.Controls.DataGridAutoGeneratingColumnEventArgs) Handles dgrx.AutoGeneratingColumn
Select Case e.Column.Header.ToString Case "DisplayName" With e.Column .Header = "Name" .DisplayIndex = 0 End With
Case "DisplayValue" With e.Column .Header = "Wert" .IsReadOnly = False .CanUserSort = True .CanUserResize = True .CanUserReorder = True
End With Case "Wert" 'der Event-Handler wird für die Column auch aufgerufen und da darf nicht gecanelt werden.... Case "Name" 'hier dasselbe Case Else e.Cancel = True End Select
Der erste Teil wird quasi zum Befüllen mit Daten aufgerufen.
Neue Datensätze werden zu keinem Zeitpunkt hinzugefügt.
Mit With dgrx
.ItemsSource = l
wird die List als ItemsSource hinzugefügt.
Es werden keine neuen Datensätze hinzugefügt.
Irgendwann später werden komplett andere Datensätze angezeigt, und dafür wird exakt derselbe komplette Code nochmals aufgerufen.
usr und e() sind in ausgeschnittenem Code, der meiner Meinung nicht relevant ist. Da wird nur vor dem l.Add(kvpValue) das kvpValue modifiziert, eher aus darstellerischen Gründen.