微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

从DataTable填充MVC Webgrid

如何解决从DataTable填充MVC Webgrid

| 我正在尝试使用在后面的代码中建立的DataTable填充MVC Webgrid,然后使用AsEnumerable()扩展方法使其可枚举。 但是,当我调用GetHtml方法时,输出不是我期望的,它由两列HasErrors和RowError组成,而我都没有定义任何列。 我想念什么吗?
        DataTable table = new DataTable();
        table.Columns.Add(\"I/Dia\");

        foreach (var item in Variations.Where(item => !table.Columns.Contains(item.CrossSectionalDiameter)))
        {
            table.Columns.Add(item.CrossSectionalDiameter);
        }

        foreach (var item in Variations)
        {
            var r = table.Rows.Add();
            r[\"I/Dia\"] = item.InternalDiameter;
            r[item.CrossSectionalDiameter] = item.Price;
        }

        return table.AsEnumerable();
    

解决方法

        我有类似的问题。最后根据您的评论进行一些处理。
        var result = new List<dynamic>();
        foreach (DataRow row in table.Rows)
        {
            var obj = (IDictionary<string,object>)new ExpandoObject();
            foreach (DataColumn col in table.Columns)
            {
                obj.Add(col.ColumnName,row[col.ColumnName]);
            }
            result.Add(obj);
        }
        var grid = new WebGrid(result)
    ,        将数据表转换为列表
    #region \"Convert DataTable to List<dynamic>\"

    public List<dynamic> ToDynamicList(DataTable dt)
    {
        List<string> cols = (dt.Columns.Cast<DataColumn>()).Select(column => column.ColumnName).ToList();
        return ToDynamicList(ToDictionary(dt),getNewObject(cols));
    }
    public List<Dictionary<string,object>> ToDictionary(DataTable dt)
    {
        var columns = dt.Columns.Cast<DataColumn>();
        var Temp = dt.AsEnumerable().Select(dataRow => columns.Select(column =>
                             new { Column = column.ColumnName,Value = dataRow[column] })
                         .ToDictionary(data => data.Column,data => data.Value)).ToList();
        return Temp.ToList();
    }
    public List<dynamic> ToDynamicList(List<Dictionary<string,object>> list,Type TypeObj)
    {
        dynamic temp = new List<dynamic>();
        foreach (Dictionary<string,object> step in list)
        {
            object Obj = Activator.CreateInstance(TypeObj);
            PropertyInfo[] properties = Obj.GetType().GetProperties();
            Dictionary<string,object> DictList = (Dictionary<string,object>)step;
            foreach (KeyValuePair<string,object> keyValuePair in DictList)
            {
                foreach (PropertyInfo property in properties)
                {
                    if (property.Name == keyValuePair.Key)
                    {
                        property.SetValue(Obj,keyValuePair.Value.ToString(),null);
                        break;
                    }
                }
            }
            temp.Add(Obj);
        }
        return temp;
    }       
    private Type getNewObject(List<string> list)
    {
        AssemblyName assemblyName = new AssemblyName();
        assemblyName.Name = \"tmpAssembly\";
        AssemblyBuilder assemblyBuilder = Thread.GetDomain().DefineDynamicAssembly(assemblyName,AssemblyBuilderAccess.Run);
        ModuleBuilder module = assemblyBuilder.DefineDynamicModule(\"tmpModule\");
        TypeBuilder typeBuilder = module.DefineType(\"WebgridRowCellCollection\",TypeAttributes.Public);
        foreach (string step in list)
        {
            string propertyName = step;
            FieldBuilder field = typeBuilder.DefineField(propertyName,typeof(string),FieldAttributes.Public);
            PropertyBuilder property = typeBuilder.DefineProperty(propertyName,System.Reflection.PropertyAttributes.None,new Type[] { typeof(string) });
            MethodAttributes GetSetAttr = MethodAttributes.Public | MethodAttributes.HideBySig;
            MethodBuilder currGetPropMthdBldr = typeBuilder.DefineMethod(\"get_value\",GetSetAttr,Type.EmptyTypes);
            ILGenerator currGetIL = currGetPropMthdBldr.GetILGenerator();
            currGetIL.Emit(OpCodes.Ldarg_0);
            currGetIL.Emit(OpCodes.Ldfld,field);
            currGetIL.Emit(OpCodes.Ret);
            MethodBuilder currSetPropMthdBldr = typeBuilder.DefineMethod(\"set_value\",null,new Type[] { typeof(string) });
            ILGenerator currSetIL = currSetPropMthdBldr.GetILGenerator();
            currSetIL.Emit(OpCodes.Ldarg_0);
            currSetIL.Emit(OpCodes.Ldarg_1);
            currSetIL.Emit(OpCodes.Stfld,field);
            currSetIL.Emit(OpCodes.Ret);
            property.SetGetMethod(currGetPropMthdBldr);
            property.SetSetMethod(currSetPropMthdBldr);
        }
        Type obj = typeBuilder.CreateType();
        return obj;
    }

    #endregion
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。