如何解决从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 举报,一经查实,本站将立刻删除。