2011-05-29 96 views
5

我想填充一個MVC Webgrid,使用在後面的代碼中構建的DataTable,然後使用AsEnumerable()擴展方法進行枚舉。從DataTable填充MVC Webgrid

但是,當我調用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(); 
+1

基於一個帖子,我發現[這裏] [1]看來這是不可能用的WebGrid做,因爲它沒有提取內容的方式來自DataTables。它將一些主題應用於動態類型,但對於所有其他類型,它從綁定類型中提取公共屬性名稱 - 值對。 RowError和HasError是DataRow上的公共屬性。 不幸的是,沒有一種乾淨的方式將網格綁定到動態構造的類型。 Bugger :( [1]:http://forums.asp.net/t/1673391.aspx/1?WebGrid%20and%20DataTable – tompipe 2011-05-29 17:02:52

回答

10

我有類似的問題。最後根據你的評論做一些工作。

 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) 
0

轉換DataTable添加到列表

#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, typeof(string), new Type[] { typeof(string) }); 
      MethodAttributes GetSetAttr = MethodAttributes.Public | MethodAttributes.HideBySig; 
      MethodBuilder currGetPropMthdBldr = typeBuilder.DefineMethod("get_value", GetSetAttr, typeof(string), 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", GetSetAttr, 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