WPF DataGrid加载时间慢

时间:2017-11-13 13:56:00

标签: c# wpf datagrid render

我们谈论最多两分钟来渲染一个窗口。该窗口包含一个Grid内的DataGrid,连接到一个最多包含1000个元素的DataTable。 我手动设置DG的高度和宽度,手动设置网格的行高,数据网格中的每一列都设置了手动宽度。

从DB获取数据并创建数据表需要最多300毫秒,但渲染它需要花费大量时间。

我尝试过虚拟化,差异很小,在程序的正常使用中几乎不可察觉。

我的问题是,如果我设置所有内容的高度和宽度,当我进入诊断会话时,它会说“对此元素进行了更改,需要计算此元素的大小和/或位置” 。每个DataGridRow最多需要200毫秒,我发现它相当慢。

我正在使用TemplateDataColumn,因为我实际上需要使用扩展正常文本框的文本框。

任何想法都非常受欢迎,我已经打了大约两个星期了,而且我的想法已经用完了。

我们在服务器上运行它,我试图让它在本地工作但是看看IBM似乎无法构建一个有效的设置,以便我轻松地安装DB2驱动程序来设置Windows DSN,我无法使用GPU在本地测试它,看它是否有助于渲染过程。

感谢您的时间和关注。

编辑:根据请求添加了数据网格代码。

虽然这个DG相当复杂,但渲染时间问题不仅限于此。

<av:DataGrid BorderThickness="0" Height="550"  x:Name="dgLineasPresupuesto" AutoGenerateColumns="False" Width="1125"
        SelectionChanged="Refresh" SelectionMode="Single" VerticalGridLinesBrush="Transparent" CanUserAddRows="False" PreviewKeyDown="MyPreviewKeyDown"
        AlternationCount="1" AlternatingRowBackground="#444D58" RowHeaderWidth="0" IsReadOnly="true" IsEnabled="True" GotFocus="dgPresupu_GotFocus"
        ItemsSource="{av:Binding}" EnableRowVirtualization="False" EnableColumnVirtualization="False" VirtualizingPanel.IsVirtualizingWhenGrouping="True" >
    <av:DataGrid.Resources>
        <Style TargetType="DataGridRow">
            <Style.Resources>
                <SolidColorBrush x:Key="{x:Static SystemColors.InactiveSelectionHighlightBrushKey}" Color="DarkGray"/>
            </Style.Resources>
        </Style>
        <av:SolidColorBrush x:Key="{x:Static av:SystemColors.HighlightBrushKey}" Color="#526885" />
        <av:Style TargetType="{x:Type av:DataGridCell}" x:Key="Celda" >
            <av:Style.Triggers>
                <av:Trigger Property="IsSelected" Value="True">
                    <av:Setter Property="Foreground" Value="Black" />
                </av:Trigger>
            </av:Style.Triggers>
        </av:Style>
        <av:Style TargetType="{x:Type av:DataGridColumnHeader}">
            <av:Setter Property="Background" Value="Transparent" />
            <av:Setter Property="BorderBrush" Value="Transparent" />
            <av:Setter Property="BorderThickness" Value="1,1,1,1" />
            <av:Setter Property="HorizontalContentAlignment" Value="Center" />
        </av:Style>
        <av:Style TargetType="{x:Type av:TextBox}">
            <av:Setter Property="BorderThickness" Value="0"/>
            <av:Setter Property="Background" Value="Transparent"/>
            <av:Setter Property="Foreground" Value="White"/>
        </av:Style>
        <av:Style TargetType="{x:Type jaime:TextBoxNum}">
            <av:Setter Property="BorderThickness" Value="0"/>
            <av:Setter Property="Background" Value="Transparent"/>
            <av:Setter Property="Foreground" Value="White"/>
        </av:Style>
        <av:Style TargetType="{x:Type andrei:TextBoxFecha}">
            <av:Setter Property="BorderThickness" Value="0"/>
            <av:Setter Property="Background" Value="Transparent"/>
            <av:Setter Property="Foreground" Value="White"/>
        </av:Style>
        <av:Style TargetType="{x:Type av:CheckBox}">
            <av:Setter Property="BorderThickness" Value="0"/>
            <av:Setter Property="Background" Value="white"/>
            <av:Setter Property="Foreground" Value="Black"/>
        </av:Style>
    </av:DataGrid.Resources>
    <av:DataGrid.Background>
        <av:StaticResource ResourceKey="tertiary_Dark"/>
    </av:DataGrid.Background>
    <av:DataGrid.HorizontalGridLinesBrush>
        <av:StaticResource ResourceKey="text_dark"/>
    </av:DataGrid.HorizontalGridLinesBrush>
    <av:DataGrid.RowBackground>
        <av:StaticResource ResourceKey="tertiary_Dark"/>
    </av:DataGrid.RowBackground>
    <av:DataGrid.Foreground>
        <av:StaticResource ResourceKey="text_dark"/>
    </av:DataGrid.Foreground>
    <av:DataGrid.Columns>
        <av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="CodProp" Header=""
                Width="20">
            <av:DataGridTemplateColumn.CellTemplate>
                <av:DataTemplate>
                    <av:TextBox TextAlignment="Center" HorizontalContentAlignment="Center"
                            IsReadOnly="True" BorderThickness="0" BorderBrush="{x:Null}" Height="20">
                        <av:TextBox.Style>
                            <av:Style TargetType="{x:Type av:TextBox}">
                                <av:Style.Triggers>
                                    <av:DataTrigger Value="">
                                        <av:DataTrigger.Binding>
                                            <av:MultiBinding
                                                    Converter="{av:StaticResource SemaforosConverterLinPres}">
                                                <av:Binding Path="RevLinLPre" />
                                                <av:Binding Path="UsuRevLPre" />
                                            </av:MultiBinding>
                                        </av:DataTrigger.Binding>
                                        <av:Setter Property="Background"
                                                Value="Transparent" />
                                    </av:DataTrigger>
                                    <av:DataTrigger Value="Ambar">
                                        <av:DataTrigger.Binding>
                                            <av:MultiBinding
                                                    Converter="{av:StaticResource SemaforosConverterLinPres}">
                                                <av:Binding Path="RevLinLPre" />
                                                <av:Binding Path="UsuRevLPre" />
                                            </av:MultiBinding>
                                        </av:DataTrigger.Binding>
                                        <av:Setter Property="Background"
                                                Value="{av:StaticResource semaforoIosAmarillo}" />
                                        <av:Setter Property="ToolTip" Value="Genérico"/>
                                    </av:DataTrigger>
                                    <av:DataTrigger Value="Rojo">
                                        <av:DataTrigger.Binding>
                                            <av:MultiBinding
                                                    Converter="{av:StaticResource SemaforosConverterLinPres}">
                                                <av:Binding Path="RevLinLPre" />
                                                <av:Binding Path="UsuRevLPre" />
                                            </av:MultiBinding>
                                        </av:DataTrigger.Binding>
                                        <av:Setter Property="Background"
                                                Value="{av:StaticResource semaforoIosRojo}" />
                                        <av:Setter Property="ToolTip" Value="Obsoleto"/>
                                    </av:DataTrigger>
                                </av:Style.Triggers>
                            </av:Style>
                        </av:TextBox.Style>
                    </av:TextBox>
                </av:DataTemplate>
            </av:DataGridTemplateColumn.CellTemplate>
        </av:DataGridTemplateColumn>
        <av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Lin"
                Width="60" CellStyle="{av:StaticResource Celda}">
            <av:DataGridTemplateColumn.CellTemplate>
                <av:DataTemplate>
                    <jaime:TextBoxNum Text="{av:Binding LinPre}" TextAlignment="Center"
                            HorizontalContentAlignment="Center" IsReadOnly="True" BorderThickness="0"
                            BorderBrush="{x:Null}" />
                </av:DataTemplate>
            </av:DataGridTemplateColumn.CellTemplate>
        </av:DataGridTemplateColumn>
        <av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Artículo"
                Width="145" CellStyle="{av:StaticResource Celda}">
            <av:DataGridTemplateColumn.CellTemplate>
                <av:DataTemplate>
                    <av:TextBox Text="{av:Binding CodArtPre}" TextAlignment="Center"
                            HorizontalContentAlignment="Center" IsReadOnly="True"
                            Background="Transparent" BorderThickness="0"
                            BorderBrush="{x:Null}" />
                </av:DataTemplate>
            </av:DataGridTemplateColumn.CellTemplate>
        </av:DataGridTemplateColumn>
        <av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Cantidad"
                Width="100" CellStyle="{av:StaticResource Celda}">
            <av:DataGridTemplateColumn.CellTemplate>
                <av:DataTemplate>
                    <jaime:TextBoxNum Text="{av:Binding CanLPre}" TextAlignment="Center"
                            HorizontalContentAlignment="Center" IsReadOnly="{av:Binding EditItem}"
                            Background="Transparent" BorderThickness="0" PreviewKeyDown="dgLinPres_previewKeyDown"
                            BorderBrush="{x:Null}" x:Name="CanLPre" LostFocus="linprelostfocus" GotFocus="tx_gotFocus"/>
                </av:DataTemplate>
            </av:DataGridTemplateColumn.CellTemplate>
        </av:DataGridTemplateColumn>
        <av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Precio"
                Width="100" CellStyle="{av:StaticResource Celda}">
            <av:DataGridTemplateColumn.CellTemplate>
                <av:DataTemplate>
                    <jaime:TextBoxNum NumDec="2"  Text="{av:Binding PrePre}" TextAlignment="Center"
                            HorizontalContentAlignment="Center" IsReadOnly="{av:Binding EditItem}"
                            Background="Transparent" BorderThickness="0" PreviewKeyDown="dgLinPres_previewKeyDown"
                            BorderBrush="{x:Null}" x:Name="PrePre" LostFocus="linprelostfocus" GotFocus="tx_gotFocus" TextChanged="tb_Change" />
                </av:DataTemplate>
            </av:DataGridTemplateColumn.CellTemplate>
        </av:DataGridTemplateColumn>
        <av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Uds./Pre."
                Width="80" CellStyle="{av:StaticResource Celda}">
            <av:DataGridTemplateColumn.CellTemplate>
                <av:DataTemplate>
                    <jaime:TextBoxNum Text="{av:Binding UdsPre}" TextAlignment="Center"
                            HorizontalContentAlignment="Center" IsReadOnly="{av:Binding EditItem}"
                            Background="Transparent" BorderThickness="0" PreviewKeyDown="dgLinPres_previewKeyDown"
                            BorderBrush="{x:Null}" x:Name="UdsPre" LostFocus="linprelostfocus" GotFocus="tx_gotFocus"/>
                </av:DataTemplate>
            </av:DataGridTemplateColumn.CellTemplate>
        </av:DataGridTemplateColumn>
        <av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Dto1"
                Width="80" CellStyle="{av:StaticResource Celda}">
            <av:DataGridTemplateColumn.CellTemplate>
                <av:DataTemplate>
                    <jaime:TextBoxNum NumDec="2"  Desc="True" Text="{av:Binding Dto1LPre}" TextAlignment="Center"
                            HorizontalContentAlignment="Center" IsReadOnly="{av:Binding EditItem}"
                            Background="Transparent" BorderThickness="0" PreviewKeyDown="dgLinPres_previewKeyDown"
                            BorderBrush="{x:Null}" x:Name="Dto1LPre" LostFocus="linprelostfocus" GotFocus="tx_gotFocus" TextChanged="tb_Change"/>
                </av:DataTemplate>
            </av:DataGridTemplateColumn.CellTemplate>
        </av:DataGridTemplateColumn>
        <av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Dto2"
                Width="80" CellStyle="{av:StaticResource Celda}">
            <av:DataGridTemplateColumn.CellTemplate>
                <av:DataTemplate>
                    <jaime:TextBoxNum NumDec="2"  Desc="True" Text="{av:Binding Dto2LPre}" TextAlignment="Center"
                            HorizontalContentAlignment="Center" IsReadOnly="{av:Binding EditItem}"
                            Background="Transparent" BorderThickness="0" PreviewKeyDown="dgLinPres_previewKeyDown"
                            BorderBrush="{x:Null}" x:Name="Dto2LPre" LostFocus="linprelostfocus" GotFocus="tx_gotFocus" TextChanged="tb_Change"/>
                </av:DataTemplate>
            </av:DataGridTemplateColumn.CellTemplate>
        </av:DataGridTemplateColumn>
        <av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Dto3"
                Width="80" CellStyle="{av:StaticResource Celda}">
            <av:DataGridTemplateColumn.CellTemplate>
                <av:DataTemplate>
                    <jaime:TextBoxNum NumDec="2"  Desc="True" Text="{av:Binding Dto3LPre}" TextAlignment="Center"
                            HorizontalContentAlignment="Center" IsReadOnly="{av:Binding EditItem}"
                            Background="Transparent" BorderThickness="0" PreviewKeyDown="dgLinPres_previewKeyDown"
                            BorderBrush="{x:Null}" x:Name="Dto3LPre" LostFocus="linprelostfocus" GotFocus="tx_gotFocus" TextChanged="tb_Change"/>
                </av:DataTemplate>
            </av:DataGridTemplateColumn.CellTemplate>
        </av:DataGridTemplateColumn>
        <av:DataGridTemplateColumn CanUserSort="True" SortMemberPath="" Header="Importe"
                Width="100" CellStyle="{av:StaticResource Celda}">
            <av:DataGridTemplateColumn.CellTemplate>
                <av:DataTemplate>
                    <av:TextBox Text="{av:Binding ImpLPre}" TextAlignment="Center"
                            HorizontalContentAlignment="Center" IsReadOnly="True"
                            Background="Transparent" BorderThickness="0"
                            BorderBrush="{x:Null}" />
                </av:DataTemplate>
            </av:DataGridTemplateColumn.CellTemplate>
        </av:DataGridTemplateColumn>
        <av:DataGridTemplateColumn Header="P" Width="60">
            <av:DataGridTemplateColumn.CellTemplate>
                <av:DataTemplate>
                    <av:CheckBox
                            IsChecked="{av:Binding ConProLPre, Converter={av:StaticResource CheckboxConverter}}"
                            HorizontalAlignment="Center"
                            VerticalAlignment="Center"  />
                </av:DataTemplate>
            </av:DataGridTemplateColumn.CellTemplate>
        </av:DataGridTemplateColumn>
        <av:DataGridTemplateColumn Header="U" Width="60">
            <av:DataGridTemplateColumn.CellTemplate>
                <av:DataTemplate>
                    <av:CheckBox IsChecked="{av:Binding ConUsrLPre, Converter={av:StaticResource CheckboxConverter}}"
                            HorizontalAlignment="Center"
                            VerticalAlignment="Center"  />
                </av:DataTemplate>
            </av:DataGridTemplateColumn.CellTemplate>
        </av:DataGridTemplateColumn>
        <av:DataGridTemplateColumn Header="N" Width="60">
            <av:DataGridTemplateColumn.CellTemplate>
                <av:DataTemplate>
                    <av:CheckBox
                            IsChecked="{av:Binding NetLPre, Converter={av:StaticResource CheckboxConverter}}"
                            HorizontalAlignment="Center"
                            VerticalAlignment="Center"  Checked="checkNeto" Unchecked="uncheckNeto"/>
                </av:DataTemplate>
            </av:DataGridTemplateColumn.CellTemplate>
        </av:DataGridTemplateColumn>
        <av:DataGridTemplateColumn Header="E" Width="60">
            <av:DataGridTemplateColumn.CellTemplate>
                <av:DataTemplate>
                    <av:CheckBox                                                       
                            IsChecked="{av:Binding EspLPre, Converter={av:StaticResource CheckboxConverter}}"
                            HorizontalAlignment="Center"
                            VerticalAlignment="Center" Checked="checkExpecial" Unchecked="uncheckEspecial"/>
                </av:DataTemplate>
            </av:DataGridTemplateColumn.CellTemplate>
        </av:DataGridTemplateColumn>
        <av:DataGridTemplateColumn Header="R" Width="60">
            <av:DataGridTemplateColumn.CellTemplate>
                <av:DataTemplate>
                    <av:CheckBox                                                       
                            IsChecked="{av:Binding RevLinLPre, Converter={av:StaticResource CheckboxConverter}}"
                            HorizontalAlignment="Center"
                            VerticalAlignment="Center" />
                </av:DataTemplate>
            </av:DataGridTemplateColumn.CellTemplate>
        </av:DataGridTemplateColumn>
    </av:DataGrid.Columns>
</av:DataGrid>

0 个答案:

没有答案