• Silverlight DataGrid自适应数据


    silverlight的DataGrid如果改成fill模式 那么当数据超长也不会出现横向滚动条 如果改成按单元格模式 如果数据较短又会出现空白的地方

    所以我自己写了个算法 目前实现了以list为数据源的形式 根据数据长短 标题长短 当前实际宽度进行了算法运算 并进行了调整 不多说直接上代码

    public static class DataGridHelper
        {
            private static double withunit = 7.2;//单个英文所占像素大小
            private static int hzwithunit = 3;//汉字与应为对比值(1个汉字相当与多少个英文)
            public static void initGrid<T>(List<T> lml,DataGrid DataGrid)
            {
                Dictionary<int, int> dic = new Dictionary<int, int>();
                Dictionary<int, int> dic2 = new Dictionary<int, int>();
                for (int j = 0; j < lml.Count; j++)
                {
    
                    DataGrid.SelectedIndex = j;
                    DataGrid.UpdateLayout();
                    DataGrid.ScrollIntoView(lml[j], DataGrid.Columns[0]);
                    for (int i = 0; i < DataGrid.Columns.Count; i++)
                    {
                        T mi = lml[j];
                        string s1 = ((TextBlock)DataGrid.Columns[i].GetCellContent(mi)).Text.ToString();
                        string s2 = DataGrid.Columns[i].Header.ToString();
                        int n1 = 0;
                        int n2 = 0;
                        for (int mm = 0; mm < s1.Length; mm++)
                        {
                            if (((int)s1[mm]) > 127)
                            {
                                n1 = n1 + hzwithunit;
                            }
                            else
                            {
                                n1 = n1 + 1;
                            }
                        }
                        for (int mm = 0; mm < s2.Length; mm++)
                        {
                            if (((int)s2[mm]) > 127)
                            {
                                n2 = n2 + hzwithunit;
                            }
                            else
                            {
                                n2 = n2 + 1;
                            }
                        }
                        if (!dic.Keys.Contains(i))
                        {
    
                            if (n1 > n2)
                            {
                                dic.Add(i, n1);
                            }
                            else
                            {
                                dic.Add(i, n2);
                            }
                        }
                        else
                        {
                            int s = 0;
                            if (n1 > n2)
                            {
                                s = n1;
                            }
                            else
                            {
                                s = n2;
                            }
                            if (dic[i] < s)
                            {
                                dic[i] = s;
                            }
                        }
                    }
                }
                DataGrid.SelectedIndex = 0;
                DataGrid.UpdateLayout();
                DataGrid.ScrollIntoView(lml.First(), DataGrid.Columns[0]);
                setColumnsWith(dic,dic2,DataGrid);
            }
            private static void setColumnsWith(Dictionary<int, int> dic, Dictionary<int, int> dic2, DataGrid DataGrid)
            {
                int n = 1;
                foreach (int i in dic.Values)
                {
                    if (n > i)
                    {
                        n = i;
                    }
                }
                foreach (int k in dic.Keys)
                {
                    if (dic[k] % n == 0)
                    {
                        if (!dic2.Keys.Contains(k))
                        {
                            dic2.Add(k, dic[k] / n);
                        }
                    }
                    else
                    {
                        if (!dic2.Keys.Contains(k))
                        {
                            dic2.Add(k, (dic[k] / n) + 1);
                        }
                    }
                }
                int n1 = 0;
                foreach (int v in dic2.Values)
                {
                    n1 = n1 + v;
                }
                if (n1 * withunit < DataGrid.ActualWidth)
                {
                    for (int i = 0; i < DataGrid.Columns.Count; i++)
                    {
                        DataGrid.Columns[i].Width = new DataGridLength(dic2[i], DataGridLengthUnitType.Star);
                    }
                }
                else
                {
                    for (int i = 0; i < DataGrid.Columns.Count; i++)
                    {
                        DataGrid.Columns[i].Width = new DataGridLength(dic2[i] * withunit);
                    }
                }
            }
        }

    这里面当数据最大长度比列标题长度短的时候就会采用列宽 当整体宽度小于DataGrid宽度的时候就会按照权重进行分配。调用的时候直接将数据源和DataGrid对象传进去就行了。另外如果是其他类型数据源 各位也可以根据实际需求改一下 很简单的。

  • 相关阅读:
    Apache 流框架 Flink,Spark Streaming,Storm对比分析(1)
    Apache 流框架 Flink,Spark Streaming,Storm对比分析(2)
    spark日志配置及问题排查方式。
    Structure Streaming和spark streaming原生API访问HDFS文件数据对比
    fstream,sstream的学习记录
    控制位数和填充0
    激活windows10(已更新工具)
    7-13 统计工龄(排序)
    Insertion or Heap Sort
    Insert or Merge
  • 原文地址:https://www.cnblogs.com/lgmbk/p/7130602.html
Copyright © 2020-2023  润新知