none
有一个类,叫做“DataSourceCreator” RRS feed

  • 问题

  • 有一个类,叫做“DataSourceCreator”。这个类可以将“表结构”数据转化为“List<Dictionary<string, string>> ”格式数据,然后绑定到“DataGrid”。

    实例地址:http://www.cnblogs.com/chengxingliang/archive/2011/02/21/1960146.html#2438576

    存在问题:

    1、列名不能是“数字”或是“汉字”,但是有些汉字是可以的。可以为“[1]”,但是列对应的值显示不出来。 如果为汉字,有的可以,有的不行。

    2、只能有一行数据,如果有两行的话会报错。

    3、有时候提示错误:“灾难性故障 (异常来自 HRESULT:0x8000FFFF (E_UNEXPECTED))

    问题:还有类似的实例吗???

    修改后的实例代码:

    namespace SilverlightApplication1
    {
        public partial class MainPage : UserControl
        {
            public MainPage()
            {
                InitializeComponent();

                List<TestBuildingItem> items = new List<TestBuildingItem> { new TestBuildingItem { num = "H01", value = "29" }, new TestBuildingItem { num = "H02", value = "2909" }, new TestBuildingItem { num = "H03", value = "2909" }, new TestBuildingItem { num = "H04", value = "2909" }, new TestBuildingItem { num = "H05", value = "2909" }, new TestBuildingItem { num = "H06", value = "2909" }, new TestBuildingItem { num = "H07", value = "2909" }, new TestBuildingItem { num = "H08", value = "2909" } };

                List<TestBuildingItem> items2 = new List<TestBuildingItem> { new TestBuildingItem { num = "H01", value = "1010" }, new TestBuildingItem { num = "H02", value = "7788" }, new TestBuildingItem { num = "H03", value = "2909" }, new TestBuildingItem { num = "H04", value = "2909" }, new TestBuildingItem { num = "H05", value = "2909" }, new TestBuildingItem { num = "H06", value = "2909" }, new TestBuildingItem { num = "H07", value = "2909" }, new TestBuildingItem { num = "H08", value = "2909" } };

                List<TestBuilding> testbuilding = new List<TestBuilding> { new TestBuilding { buildingname = "五角楼", testbuildingitems = items }, new TestBuilding { buildingname = "五角场", testbuildingitems = items } };

                
                                List<Dictionary<string, string>> dicList = new List<Dictionary<string, string>>();

                                Dictionary<string, string> dicfirst = new Dictionary<string, string>();

                                Dictionary<string, string> dic = new Dictionary<string, string>();

                                foreach (var v in testbuilding)
                                {

                                dic["建筑物"] = v.buildingname;
                                for (int j = 0; j < v.testbuildingitems.Count; j++)
                                {
                                    dic[v.testbuildingitems[j].num.ToString()] = v.testbuildingitems[j].value.ToString();
                                   
                                }
                                dicList.Add(dic);
                                }

                                var dl = dicList;   

                                DataGrid dgrid = new DataGrid();
                                dgrid.HorizontalAlignment = HorizontalAlignment.Left;
                                dgrid.VerticalAlignment = VerticalAlignment.Top;
                                dgrid.Margin = new Thickness(20, 5, 0, 0);
                                dgrid.Width = 960;
                                dgrid.Name = "";

                                var datasource = GetEnumerable(dicList).ToDataSource();
                                dgrid.ItemsSource = GetEnumerable(dicList).ToDataSource();

                                for (int i = 1; i < dgrid.Columns.Count; i++)
                                {
                                    //dgrid.Columns[1].Header = dgrid.Columns[1].Header.ToString().Replace("H", "");
                                    dgrid.Columns[i].Header = i.ToString();
                                }

                                this.mainPanel.Children.Add(dgrid);

                                
                
            }
            public IEnumerable<IDictionary> GetEnumerable(List<Dictionary<string, string>> SourceList)
            {
                for (int i = 0; i < SourceList.Count; i++)
                {
                    var dict = new Dictionary<string, string>();
                    dict = SourceList[i];
                    yield return dict;
                }
            }

        }
        

    Science and technology is my lover.

    2012年8月1日 2:56

全部回复

  • 第一段代码:

    public static class DataSourceCreator
        {
            //private static readonly Regex PropertNameRegex =
            //       new Regex(@"^[A-Za-z]+[A-Za-z1-9_]*$", RegexOptions.Singleline);
            public static List<object> ToDataSource(this IEnumerable<IDictionary> list)
            {
                IDictionary firstDict = null;
                bool hasData = false;
                foreach (IDictionary currentDict in list)
                {
                    hasData = true;
                    firstDict = currentDict;
                    break;
                }
                if (!hasData)
                {
                    return new List<object> { };
                }
                if (firstDict == null)
                {
                    throw new ArgumentException("IDictionary entry cannot be null");
                }
                Type objectType = null;
                TypeBuilder tb = GetTypeBuilder(list.GetHashCode());
                ConstructorBuilder constructor =
                            tb.DefineDefaultConstructor(
                                        MethodAttributes.Public |
                                        MethodAttributes.SpecialName |
                                        MethodAttributes.RTSpecialName);
                foreach (DictionaryEntry pair in firstDict)
                {
                    //if (PropertNameRegex.IsMatch(Convert.ToString(pair.Key), 0))
                    //{
                        CreateProperty(tb,
                                        Convert.ToString(pair.Key),
                                        pair.Value == null ?
                                                    typeof(object) :
                                                    pair.Value.GetType());
                    //}
    ////                else
    //                {
    //                    throw new ArgumentException(
    //                                @"Each key of IDictionary must be
    //                                alphanumeric and start with character.");
    //                }
                }
                objectType = tb.CreateType();
                return GenerateArray(objectType, list, firstDict);
            }
            private static List<object> GenerateArray(Type objectType, IEnumerable<IDictionary> list, IDictionary firstDict)
            {
                var itemsSource = new List<object>();
                foreach (var currentDict in list)
                {
                    if (currentDict == null)
                    {
                        throw new ArgumentException("IDictionary entry cannot be null");
                    }
                    object row = Activator.CreateInstance(objectType);
                    foreach (DictionaryEntry pair in firstDict)
                    {
                        if (currentDict.Contains(pair.Key))
                        {
                            PropertyInfo property =
                                objectType.GetProperty(Convert.ToString(pair.Key));
                            property.SetValue(
                                row,
                                Convert.ChangeType(
                                        currentDict[pair.Key],
                                        property.PropertyType,
                                        null),
                                null);
                        }
                    }
                    itemsSource.Add(row);
                }
                return itemsSource;
            }
          


    Science and technology is my lover.

    2012年8月1日 2:57
  • 第二段代码:

      private static TypeBuilder GetTypeBuilder(int code)
            {
                AssemblyName an = new AssemblyName("TempAssembly" + code);
                AssemblyBuilder assemblyBuilder =
                    AppDomain.CurrentDomain.DefineDynamicAssembly(
                        an, AssemblyBuilderAccess.Run);
                ModuleBuilder moduleBuilder = assemblyBuilder.DefineDynamicModule("MainModule");
                TypeBuilder tb = moduleBuilder.DefineType("TempType" + code
                                    , TypeAttributes.Public |
                                    TypeAttributes.Class |
                                    TypeAttributes.AutoClass |
                                    TypeAttributes.AnsiClass |
                                    TypeAttributes.BeforeFieldInit |
                                    TypeAttributes.AutoLayout
                                    , typeof(object));
                return tb;
            }
            private static void CreateProperty(TypeBuilder tb, string propertyName, Type propertyType)
            {
                FieldBuilder fieldBuilder = tb.DefineField("_" + propertyName,
                                                            propertyType,
                                                            FieldAttributes.Private);

                PropertyBuilder propertyBuilder =
                    tb.DefineProperty(
                        propertyName, PropertyAttributes.HasDefault, propertyType, null);
                MethodBuilder getPropMthdBldr =
                    tb.DefineMethod("get_" + propertyName,
                        MethodAttributes.Public |
                        MethodAttributes.SpecialName |
                        MethodAttributes.HideBySig,
                        propertyType, Type.EmptyTypes);
                ILGenerator getIL = getPropMthdBldr.GetILGenerator();
                getIL.Emit(OpCodes.Ldarg_0);
                getIL.Emit(OpCodes.Ldfld, fieldBuilder);
                getIL.Emit(OpCodes.Ret);
                MethodBuilder setPropMthdBldr =
                    tb.DefineMethod("set_" + propertyName,
                      MethodAttributes.Public |
                      MethodAttributes.SpecialName |
                      MethodAttributes.HideBySig,
                      null, new Type[] { propertyType });
                ILGenerator setIL = setPropMthdBldr.GetILGenerator();
                setIL.Emit(OpCodes.Ldarg_0);
                setIL.Emit(OpCodes.Ldarg_1);
                setIL.Emit(OpCodes.Stfld, fieldBuilder);
                setIL.Emit(OpCodes.Ret);
                propertyBuilder.SetGetMethod(getPropMthdBldr);
                propertyBuilder.SetSetMethod(setPropMthdBldr);
            }
        }
        /// <summary>
        /// 存放动态表格的字段
        /// </summary>
        public class GridClass
        {
            private string _ShowName;
            private string _Name;
            /// <summary>
            /// 显示名称
            /// </summary>
            public string ShowName
            {
                get { return _ShowName; }
                set { _ShowName = value; }
            }
            /// <summary>
            /// 字段名称
            /// </summary>
            public string Name
            {
                get { return _Name; }
                set { _Name = value; }
            }


        }


        public class TestBuilding
        {
            public string buildingname { get; set; }

            public List<TestBuildingItem> testbuildingitems { get; set; }
        }

        public class TestBuildingItem
        {
           public  string  num;
           public string value;
        }


    }


    Science and technology is my lover.

    2012年8月1日 2:57