c# - 在紧凑的框架中动态增长和收缩 DataGrid?

标签 c# datagrid windows-mobile compact-framework

我在 Compact Framework 中有一个 DataGrid,我需要填写数万条记录,事实证明这是一个问题,因为我在尝试这样做时内存不足。

有没有办法动态地只显示和加载用户正在查看的行,而不是一次性将所有行转储到网格中?

最佳答案

下面的代码将自动调整数据源为数组的数据网格的列宽。

    public static void AutosizeColumnsWithArray(DataGrid grid, PaintEventArgs e)
    {
        Font dataFont = grid.Font;
        Font headerFont = GetHeaderFont(dataFont);
        IList list = null;
        if (grid.DataSource is IList)
        {
            list = (IList) grid.DataSource;
        }
        else if (grid.DataSource is IListSource)
        {
            list = ((IListSource) grid.DataSource).GetList();
        }

        if (list == null || list.Count < 0)
        {
            return;
        }

        if (grid.TableStyles.Count == 0)
        {
            return;
        }

        var pdc = TypeDescriptor.GetProperties(list[0]);
        var dataGridTableStyle = new DataGridTableStyle();
        dataGridTableStyle.MappingName = GetMappingName(list);
        int totalWidth = 0;

        for (int i = 0; i < pdc.Count; i++)
        {
            var columnName = pdc[i].Name;

            bool validColumn = grid.TableStyles[0].GridColumnStyles.Contains(columnName);
            if (!validColumn)
            {
                continue;
            }

            var gridColumnStyle = grid.TableStyles[0].GridColumnStyles[columnName];
            var indexToEdit = grid.TableStyles[0].GridColumnStyles.IndexOf(gridColumnStyle);

            var headerText = grid.TableStyles[0].GridColumnStyles[columnName].HeaderText;
            var maxSize = e.Graphics.MeasureString(headerText, headerFont);
            int maxLength = headerText.Length;

            int rowCount = 0;
            const int maxRowsToCompare = 200;
            foreach (object o in list)
            {
                if (rowCount == maxRowsToCompare)
                {
                    break;
                }
                object result = pdc[i].GetValue(o);

                string value = result == null ? string.Empty : result.ToString().Trim();

                if (ValueCannotBeLongest(value, maxLength))
                {
                    rowCount++;
                    continue;
                }

                SizeF size = e.Graphics.MeasureString(value, dataFont);
                if (size.Width > maxSize.Width)
                {
                    maxSize = size;
                    maxLength = value.Length;
                }
                rowCount++;
            }
            var newWidth = (int) (maxSize.Width + 5);
            grid.TableStyles[0].GridColumnStyles[indexToEdit].Width = newWidth;
            totalWidth += newWidth;
        }
    }

    private static bool ValueCannotBeLongest(string value, int maxLength)
    {
        return (value.Length == 0) || (value.Length + 3 < maxLength);
    }

    private static string GetMappingName(IList list)
    {
        string result;

        if (list is ITypedList)
        {
            result = ((ITypedList) list).GetListName(null);
        }
        else
        {
            result = list.GetType().Name;
        }

        return result;
    }

    private static Font GetHeaderFont(Font dataFont)
    {
        string FontName = dataFont.Name;
        float FontSize = dataFont.Size;
        return new Font(FontName, FontSize, FontStyle.Bold);
    }

关于c# - 在紧凑的框架中动态增长和收缩 DataGrid?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10992547/

相关文章:

时间:2019-03-08 标签:c#system.reflection.emitldfld

c# - ServiceStack JsonServiceClient 使用路由属性发送抛出异常未找到

c# - Datagrid 组合框消失的内容 + 自动完成

c# - 为什么在 .NET 4.6 中更改 WPF DataGrid ItemsSource 如此缓慢?

.net - 如何在 Windows Mobile 中读取 GPS 信号强度?

c# - 如何在 Windows Mobile 中支持不同的屏幕尺寸?

c# - 在Windows Mobile上播放音频URL

c# - 如何检查字符串是否包含 List<string> 的任何元素?

c# - 如何在 wpf 的两个不同窗口中绑定(bind)两个控件?

ruby-on-rails - 如何根据rails中的当前范围修改datagrid上的过滤器