silverlight datagrid动态生成列&动态绑定

原创 2011年12月16日 16:42:43


由于返回的数据表的列不是固定的,所以webservice端的实体我们直接建立如下格式:

    public class DynamicObj
    {
        public string Item_Name { get; set; }           //列名称
        public List<string> Item_Value { get; set; }    //列值集合
    }

然后webservice端返回该对象的集合,也就是列的集合。silverlight做如下处理,就可以动态生成绑定了:

        private void client_Get_DynamicObjCompleted(object sender, Get_DynamicObjCompletedEventArgs e)
        {
            DynamicObj[] result = e.Result;
            List<Dictionary<string, string>> dataSources = new List<Dictionary<string, string>>(result[0].Item_Value.Length);

            for (int j = 0; j < result[0].Item_Value.Length; j++)
            {
                Dictionary<string, string> item = new Dictionary<string, string>();//数据行(Key:列名,Value:列值)
                for (int i = 0; i < result.Length; i++)
                {
                    //列名必须符合变量命名规则
                    item.Add(result[i].Item_Name.Replace(" ", "_").Replace("-", "_"), result[i].Item_Value[j]);
                }
                dataSources.Add(item);
            }
            dataGrid1.ItemsSource = GetEnumerable(dataSources).ToDataSource();
        }

GetEnumerable:

        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;
            }
        }

ToDataSource为IEnumerable<IDictionary>的扩展方法,代码如下:

    public static class DataSourceCreator
    {
        private static readonly Regex PropertNameRegex =
               new Regex(@"^[A-Za-z]+[A-Za-z1-9_]*{1}quot;, 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;
        }
        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);
        }
    }


datagrid动态加载列(续)

之前有一篇博客写到了如何动态加载datagrid的列,上次只是介绍如何动态动态表头,并没有将数据添加到datagrid中,本次主要来说如何将数据库中的数据,动态添加到每一列中。      先说一下为...
  • u013038643
  • u013038643
  • 2016年04月24日 17:25
  • 1377

EasyUI_datagrid实现动态加载列并为其绑定数据

最近项目中遇到了这么一个需求,在datagrid中显示的数据需要动态的加载,也就是说表格中显示的列是不固 定的,显示的列的名称和列的数量都是不固定的,这些数据都是需要我们从后台拿来数据然后在动态的绑...
  • u013045437
  • u013045437
  • 2016年03月06日 23:24
  • 4691

silverlight根据json字符串动态创建实体类

1、接收json字符串: //用JsonValue转换json字符串是为了之后获得json字符串的每行数据和每一列的列名 JsonValue jv = JsonValue.Parse(json);...
  • mutou965175859
  • mutou965175859
  • 2015年07月10日 13:22
  • 1654

【datagrid】动态加载列

之前我们的项目在前台显示只需要把数据从数据库读出来进行显示就可以,datagrid的表头字段都是写死的,把数据往表里一扔,就基本没什么事儿了,结果客户前几天要求,其中一个字段不能是死的,应该是有多少项...
  • u013036688
  • u013036688
  • 2016年01月03日 16:32
  • 3161

Easyui DataGrid动态生成列

 一、DataGrid基本定义 1、HTML Page [html] view plaincopyprint? body>       table id="myList...
  • liuchuan__________
  • liuchuan__________
  • 2015年09月17日 17:14
  • 8991

WPF-DataGrid后台动态生成列

DataGrid后台动态生成列 Now that you know the basics of the Silverlight DataGrid and how to specify...
  • yqj234
  • yqj234
  • 2016年03月14日 15:49
  • 4950

easyui datagrid 动态表头 动态columns 的一种实现方式

function doUpgradeDataQueryFun(){ var actTypeVal=$("#actType").combobox('getValue'); var actIdVa...
  • big1989wmf
  • big1989wmf
  • 2017年04月12日 16:38
  • 1401

datagrid动态加载列

最近参加了组织部的项目,由于加载的表头需要从数据库中读取,而且你也不知道有几个,这就用到了动态加载列。经过研究理解,有了一点点成效。。。     由于本项目中既有固定的列也有动态添加的列,这个思路就...
  • u013038643
  • u013038643
  • 2016年04月10日 09:47
  • 702

easyui之datagrid动态修改列

var options={}; options.columns = eval(s); $('#tt').datagrid(options); $('#tt').datagrid('options'...
  • printxfh
  • printxfh
  • 2017年06月02日 10:53
  • 1379

easyui之datagrid动态修改列

easyui datagrid 定义列的方式通常是: $('#grid').datagrid({columns:[[ {field:'f1',title:'字段1',width:160}...
  • liuxiao723846
  • liuxiao723846
  • 2015年08月28日 15:12
  • 2954
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:silverlight datagrid动态生成列&动态绑定
举报原因:
原因补充:

(最多只允许输入30个字)