2011-05-29 15 views
5

से एमवीसी वेबग्रिड पॉप्युलेट करें मैं डेटाटेबल का उपयोग कर एक एमवीसी वेबग्रिड को पॉप्युलेट करने की कोशिश कर रहा हूं जो कोड के पीछे बनाया गया है और फिर AsEnumerable() एक्सटेंशन विधि का उपयोग करके गणना करने योग्य है।डेटाटेबल

हालांकि, जब मैं GetHtml विधि को कॉल करता हूं, तो आउटपुट मैं अपेक्षा नहीं करता हूं, इसमें दो कॉलम हैसइरर्स और रोवरर और मैंने जो कॉलम परिभाषित किए हैं उनमें से कोई भी नहीं है।

क्या मुझे कुछ याद आ रही है?

 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 के साथ क्या करना है क्योंकि यह सामग्री निकालने का कोई रास्ता नहीं है नहीं है सूची डेटाटेबल्स से। यह गतिशील प्रकारों के लिए कुछ ह्युरिस्टिक लागू होता है, लेकिन अन्य सभी प्रकारों के लिए यह बाध्य प्रकार से सार्वजनिक संपत्ति नाम-मूल्य जोड़े निकालता है। RowError और HasError DataRow पर सार्वजनिक गुण हैं। दुर्भाग्यवश ग्रिड को गतिशील रूप से निर्मित प्रकार में बांधने का एक साफ तरीका नहीं है। बगजर :( [1]: http://forums.asp.net/t/1673391.aspx/1?WebGrid%20and%20DataTable – tompipe

उत्तर

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

Convert 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