我正在编写一个简单的应用程序来在DataGrid上显示一些数据。这些数据是浮点数和时间戳。时间戳是一个uint类型的,表示自2000年以来经过的秒数。
我成功地完成了任务,但发现显示datagrid需要很长时间(约1分钟)。数据大约有20,000个。我想20,000个数据由一个uint和一个float组成并不算太多。下一个请求是将时间显示为格式化的时间而不是自2000年以来的秒数。我通过让XAML看起来像这样来实现这一点:
我成功地完成了任务,但发现显示datagrid需要很长时间(约1分钟)。数据大约有20,000个。我想20,000个数据由一个uint和一个float组成并不算太多。下一个请求是将时间显示为格式化的时间而不是自2000年以来的秒数。我通过让XAML看起来像这样来实现这一点:
<kit:DataGridTextColumn Header="FilteredValue" Binding="{Binding Path=FilteredValue}" />
<kit:DataGridTextColumn Header="Timestamp" Binding="{Binding Path=Timestamp, Converter={StaticResource TimeConverter}}" CanUserSort="False" />
TimeConverter方法的外观如下:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
DateTime currentDateTime = new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc);
currentDateTime = currentDateTime.AddSeconds((uint)value);
return currentDateTime.ToString();
}
这个也可以正常工作。然而,事实证明一些原始数据可能是0xFFFFFFFF。这意味着没有数据或无效数据。在这种情况下,我不想转换为日期。因此我写了以下代码:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if ((uint)value == 0xFFFFFFFF)
{
// don't bother to convert
return ((uint)value).ToString("X");
}
else
{
DateTime currentDateTime = new DateTime(2000, 1, 1, 0, 0, 0, DateTimeKind.Utc);
currentDateTime = currentDateTime.AddSeconds((uint)value);
return currentDateTime.ToString();
}
}
再次运行后,虽然可以正常工作,但速度非常慢。比原来慢了大约10分钟。这让我感到惊讶。难道只是因为额外的代码运行了23000次吗? 1. 我该怎么做?我能在XAML中做些什么,以便我的转换器不会在不必要的情况下被调用吗? 2. 当其中一个测量值(FilteredValues)为0xFFFFFFFF时,它会显示为NaN。这可能没问题,但最好只显示0xFFFFFFFF或“无数据”。我认为它被设置为NaN是因为底层数据类型是浮点数。
有任何想法吗? 谢谢, Dave
以下是XAML代码。最后的Datagrid是我们关注的部分。请注意,我甚至将“IsVirtualizing”设置为True。还请注意使用ScrollViewer。我这样做是因为如果没有这个,我无法在最后一个网格上看到所有行(当最后一个网格终于显示出来时)。删除此功能并没有提高速度。
<Window x:Class="STDatabaseReader.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:chartingToolkit="clr-namespace:System.Windows.Controls.DataVisualization.Charting;assembly=System.Windows.Controls.DataVisualization.Toolkit" xmlns:kit="http://schemas.microsoft.com/wpf/2008/toolkit" xmlns:local="clr-namespace:STDatabaseReader"
Title="Smart Transmitter Database Reader">
<Window.Resources>
<local:BytesToStringConverter x:Key="BytesToStringConverter"></local:BytesToStringConverter>
<local:TimeConverter x:Key="TimeConverter"></local:TimeConverter>
</Window.Resources>
<Grid>
<ScrollViewer>
<StackPanel Orientation="Vertical">
<Button Name="m_btnFetchData" HorizontalAlignment="Left" Click="m_btnFetchData_Click">Fetch File</Button>
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Vertical">
<Label HorizontalAlignment="Center">Partition 1</Label>
<kit:DataGrid Name="m_gridPartion1" AutoGenerateColumns="False">
<kit:DataGrid.Columns>
<kit:DataGridTextColumn Header="Header Info" Binding="{Binding Path=HeaderInfo, Converter={StaticResource BytesToStringConverter}}" CanUserSort="False" />
<kit:DataGridTextColumn Header="Transmitter Id" Binding="{Binding Path=TransmitterId, Converter={StaticResource BytesToStringConverter}}" CanUserSort="False" />
<kit:DataGridTextColumn Header="DeviceNumber" Binding="{Binding Path=DeviceNumber}" />
<kit:DataGridTextColumn Header="HardwareVersion" Binding="{Binding Path=HardwareVersion}" />
<kit:DataGridTextColumn Header="CRC" Binding="{Binding Path=CRC}" />
</kit:DataGrid.Columns>
</kit:DataGrid>
</StackPanel>
<StackPanel Orientation="Vertical">
<Label HorizontalAlignment="Center">Partition 3</Label>
<kit:DataGrid Name="m_gridPartion3" AutoGenerateColumns="False">
<kit:DataGrid.Columns>
<kit:DataGridTextColumn Header="Header Info" Binding="{Binding Path=HeaderInfo, Converter={StaticResource BytesToStringConverter}}" CanUserSort="False" />
<kit:DataGridTextColumn Header="SystemTime" Binding="{Binding Path=SystemTime, Converter={StaticResource TimeConverter}}" />
</kit:DataGrid.Columns>
</kit:DataGrid>
</StackPanel>
</StackPanel>
<StackPanel Orientation="Vertical">
<Label HorizontalAlignment="Center">Partition 2</Label>
<kit:DataGrid Name="m_gridPartion2" AutoGenerateColumns="False">
<kit:DataGrid.Columns>
<kit:DataGridTextColumn Header="Header Info" Binding="{Binding Path=HeaderInfo, Converter={StaticResource BytesToStringConverter}}" CanUserSort="False" />
<kit:DataGridTextColumn Header="FirmwareRevision" Binding="{Binding Path=FirmwareRevision, Converter={StaticResource BytesToStringConverter}}" CanUserSort="False" />
<kit:DataGridTextColumn Header="SoftwarePartNumber" Binding="{Binding Path=SoftwarePartNumber, Converter={StaticResource BytesToStringConverter}}" CanUserSort="False" />
<kit:DataGridTextColumn Header="FirmwareUpgradeTime" Binding="{Binding Path=FirmwareUpgradeTime,Converter={StaticResource TimeConverter}}" />
<kit:DataGridTextColumn Header="DatabaseEraseTime" Binding="{Binding Path=DatabaseEraseTime,Converter={StaticResource TimeConverter}}" />
<kit:DataGridTextColumn Header="RangeEnzymeElectrode" Binding="{Binding Path=RangeEnzymeElectrode}" />
<kit:DataGridTextColumn Header="OffsetEnzymeElectrode" Binding="{Binding Path=OffsetEnzymeElectrode}" />
<kit:DataGridTextColumn Header="BiasValue" Binding="{Binding Path=BiasValue}" />
</kit:DataGrid.Columns>
</kit:DataGrid>
</StackPanel>
<StackPanel Orientation="Horizontal">
<StackPanel Orientation="Vertical">
<Label HorizontalAlignment="Center">Partition 4 - HeaderInfo</Label>
<kit:DataGrid Name="m_gridDataHeader" AutoGenerateColumns="False">
<kit:DataGrid.Columns>
<kit:DataGridTextColumn Header="Header Info" Binding="{Binding Path=HeaderInfo, Converter={StaticResource BytesToStringConverter}}" CanUserSort="False" />
</kit:DataGrid.Columns>
</kit:DataGrid>
</StackPanel>
<StackPanel Orientation="Vertical">
<Label HorizontalAlignment="Center">Partition 4 - Chemistry Data</Label>
<kit:DataGrid Name="m_gridData" AutoGenerateColumns="False" VirtualizingStackPanel.IsVirtualizing="True" Loaded="m_gridData_Loaded">
<kit:DataGrid.Columns>
<!--
<kit:DataGridTextColumn Header="Noise" Binding="{Binding Path=Noise, StringFormat=\{0:X8\}}" />
<kit:DataGridTextColumn Header="FilteredValue" Binding="{Binding Path=FilteredValue, StringFormat='X'}" />
<kit:DataGridTextColumn Header="Timestamp" Binding="{Binding Path=Timestamp, StringFormat=\{0:X\}}" /> -->
<kit:DataGridTextColumn Header="Noise" Binding="{Binding Path=Noise}" />
<kit:DataGridTextColumn Header="FilteredValue" Binding="{Binding Path=FilteredValue}" />
<kit:DataGridTextColumn Header="Timestamp" Binding="{Binding Path=Timestamp, Converter={StaticResource TimeConverter}}" CanUserSort="False" />
</kit:DataGrid.Columns>
</kit:DataGrid>
</StackPanel >
</StackPanel>
</StackPanel>
</ScrollViewer>
</Grid>