Laden...

DataGrid und Databinding... Nur jeder zweite Datensatz wird angezeigt und es gibt Anzeigefehler

Erstellt von esven vor 13 Jahren Letzter Beitrag vor 13 Jahren 1.911 Views
esven Themenstarter:in
40 Beiträge seit 2006
vor 13 Jahren
DataGrid und Databinding... Nur jeder zweite Datensatz wird angezeigt und es gibt Anzeigefehler

Hallo,

Ich verwende in meiner WPF-Anwendung das DataGrid-Control.

Die ItemsSource-Property derselben wurde auf eine List<T> gesetzt. Nachdem ich eine Datei geladen habe, wurden ca. 26.000 Werte in die Liste geschrieben, nach einem Items.Refresh() auf das DataGrid werden auch welche angezeigt. Allerdings genau immer nur jedes zweite Element.
Wo sind die anderen?

Außerdem habe ich noch das Problem, wenn man im Grid herumscrollt zeigt es irgendwann in den Zeilen immer dieselben Werte an. Also als wenn 1.000 mal das gleiche Objekt geladen wurde.

Was kann das sein?

Als kleine Info hier noch die Deklaration des Grids:


<DataGrid Margin="2" Background="WhiteSmoke" Foreground="Black" Name="CanFrameGrid" BorderThickness="0" CanUserReorderColumns="False" CanUserResizeColumns="True" CanUserSortColumns="False" CanUserResizeRows="False" GridLinesVisibility="Horizontal" LoadingRow="CanFrameGrid_LoadingRow" IsReadOnly="True">
<DataGrid.ColumnHeaderStyle>
<Style TargetType="{x:Type DataGridColumnHeader}">
<Setter Property="Background" Value="DarkBlue" />
<Setter Property="Foreground" Value="WhiteSmoke" />
<Setter Property="MinWidth" Value="50" />
<Setter Property="MinHeight" Value="19" />
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Columns>
<DataGridTextColumn Header="Time" MinWidth="75" Binding="{Binding TimeString}" />
<DataGridTextColumn Header="No" MinWidth="75" Binding="{Binding SeqIdString}" />
<DataGridTextColumn Header="ID" MinWidth="75" Binding="{Binding IdentifierString}"/>
<DataGridTextColumn Header="Chan" MinWidth="50" Binding="{Binding ChannelString}"/>
<DataGridTextColumn Header="Length" MinWidth="50" Binding="{Binding DlcString}"/>
<DataGridTextColumn Header="Direction" MinWidth="75" Binding="{Binding DirectionString}"/>
<DataGridTextColumn Header="Data" Binding="{Binding DataString}"/>
</DataGrid.Columns>
</DataGrid>

Bzw. auch das, was im Code passiert:


dataGridSource = new List<CanFrame>;();
CanFrameGrid.ItemsSource = dataGridSource;
CanFrameGrid.AutoGenerateColumns = false;

[...]
while (...)
{
dataGridSource.Add([...]);
CanFrameGrid.Items.Refresh();
}

MfG
Sven

Cäsar machte das Lager voll und jeder stand stramm bei seinem Haufen.

4.939 Beiträge seit 2008
vor 13 Jahren

Hallo,

ich kenne zwar das neue DataGrid noch nicht so genau, aber wäre es nicht besser, wenn du zuerst die Liste erzeugst und zuletzt an das DataGrid bindest?

Ich denke außerdem auch, daß eine ObservableCollection<> hier viel besser wäre, da diese explizit für das DataBinding gedacht ist.

esven Themenstarter:in
40 Beiträge seit 2006
vor 13 Jahren

Hallo Th69,

Danke für die Antwort. Leider ist es nicht möglich die Daten erst zu laden und dann zu binden, da das Programm für Livelogging verwendet werden soll.

Ich habe jetzt die BindingList anstatt der List verwendet und lösche die ältesten Einträge, sobald 5000 Einträge angezeigt werden. Das hat schon geholfen. Hauptproblem ist wahrscheinlich, dass ca. alle 300 us neue Daten zum Anzeigen hinzukommen...

Gruß

Cäsar machte das Lager voll und jeder stand stramm bei seinem Haufen.

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo,

Hauptproblem ist wahrscheinlich, dass ca. alle 300 us neue Daten zum Anzeigen hinzukommen.

Das ist ziemlich sicher ein Problem
Zudem kann kein Mensch der Welt so schnell sehen.
Deshalb ist es besser wenn du die Daten zwar alle 300us reinbekommst aber diese nur in einem Intervall anzeigst.

D.h. du aktualisierst die GUI nur einmal in der Sekunde.
Ansonsten hängt sich der GUI Prozess früher oder später auf

Gruß
Michael

esven Themenstarter:in
40 Beiträge seit 2006
vor 13 Jahren

Also ich sammel auch immer 100 ms die Daten in ein array und füge dass dann der BindingList hinzu.

Somit aktualisiere ich eigentlich auch nur alle 100 ms.

Cäsar machte das Lager voll und jeder stand stramm bei seinem Haufen.