【问题标题】:Datagrid render slow数据网格渲染缓慢
【发布时间】:2015-09-03 10:02:27
【问题描述】:

我正在使用大约 400-500 行的 Datagrid,而且速度非常慢。我正在使用 .NET 4.5 并尝试使用该属性

VirtualizingPanel.IsVirtualizingWhenGrouping="True"

但没有效果。有人可以帮我解释一下为什么这个属性不适合我吗?

我的数据网格 xaml 是

    <DataGrid VirtualizingPanel.IsVirtualizingWhenGrouping="True"  VirtualizingPanel.VirtualizationMode="Recycling" Name="DetailsDlg"  Grid.Column="1" Grid.Row="0" MinWidth="300" MinHeight="500"  IsReadOnly="True" CanUserSortColumns="False" CanUserDeleteRows="False" SelectionMode="Single" ItemsSource="{Binding UnitDataTable, Mode=OneWay}"/>

我已尝试删除 VirtualizingPanel.VirtualizationMode 但没有效果。是渲染需要时间而不是加载我的 DataTable

我的视图模型

    private object _SelectedItem;
    public object SelectedItem
    {
        get
        {
            return _SelectedItem;
        }
        set
        {
            if (value != _SelectedItem)
            {
                _SelectedItem = value;

                OnPropertyChanged("SelectedItem");
                UpdateDataTable(_SelectedItem);
            }
        }
    }

    private DataTable _UnitDataTable;
    public DataTable UnitDataTable
    {
        get
        {
            return _UnitDataTable;
        }
        set
        {
            if (value != _UnitDataTable)
            {
                _UnitDataTable = value;
                OnPropertyChanged("UnitDataTable");
            }
        }
    }

    private void UpdateDataTable(object SelectedObject)
    {
        unittable = new DataTable("Unit Table");

        if (SelectedObject != null)
        {
            string temp = ORBATTool.SelectedUnit.ToString();

            List<MUnit> tempUnitList = new List<MUnit>();

            if (SelectedObject is UnitTree)
            {                    
                AddChildUnitsToList(SelectedObject as UnitTree, tempUnitList);       
            }

            else if (SelectedObject is MUnit)
            {
                tempUnitList.Add(SelectedObject as MUnit);
            }
            List<string> resList = CreateResList(tempUnitList);



            unittable.Columns.Add(iNet_Localization.Cultures.Resources.Callsign);
            unittable.Columns.Add(iNet_Localization.Cultures.Resources.Size);
            unittable.Columns.Add(iNet_Localization.Cultures.Resources.Strength);
            unittable.Columns.Add(iNet_Localization.Cultures.Resources.Position);

            foreach (string st in resList)
            {
                string colname = st.Replace("(", "|");
                colname = colname.Replace(")", "|");
                unittable.Columns.Add(colname);
            }

            int firstRes = 4;
            int[] scoreArray = new int[resList.Count + firstRes];                

            foreach (MUnit unit in tempUnitList)
            {                   
                DataRow dr = unittable.NewRow();

                dr[0] = unit.Callsign;
                dr[1] = resourceSet.GetString(unit.Size,true);
                dr[2] = unit.Strength;
                dr[3] = unit.PositionInCurrentGSP;
                int resindex = firstRes;

                foreach (string res in resList)
                {
                    string resstring = string.Empty;
                    foreach (var unitres in unit.Resources)
                    {
                        if (unitres.Value == res)
                        {
                            resstring = unitres.Key;
                        }
                    }                        

                    // Calculate Res 'Scores'
                    try
                    {
                        if (resstring != string.Empty)
                        {
                            int numVal = Convert.ToInt32(resstring);
                            scoreArray[resindex] = scoreArray[resindex] + numVal;
                        }
                    }
                    catch (FormatException e)
                    {
                        // ignore value?
                    }
                    dr[resindex++] = resstring;
                }

                unittable.Rows.Add(dr);
            }
            UnitDataTable = unittable;
        }

    }

【问题讨论】:

  • 请向我们展示您的 Itemssource 中的模型对象
  • 我已经用 ViewModel 更新了问题
  • 你是如何获取数据表的。你检查了检索时间吗?
  • 是的。我在 UpdateDataTable 中的数据很快就被提取了。需要时间的是 UnitDataTable 的渲染。

标签: c# wpf datagrid


【解决方案1】:

这几件事可以帮助提高性能。

  • 如果您的数据网格中有大量行和列,则应使用自定义分页。

  • 删除外部滚动查看器(如果已应用)。

    EnableColumnVirtualization = true
    EnableRowVirtualization = true
    ItemsSource="{Binding MyDataTable, IsAysnc=True} 
    

【讨论】:

    猜你喜欢
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 2019-01-28
    • 1970-01-01
    • 2020-12-06
    • 2015-07-09
    • 2021-06-04
    相关资源
    最近更新 更多