我是C#的新手,在Stackoverflow.com上经历了很多问题,并没有找到符合我要求的解决方案。所以最后在这里发帖。
我的要求是从数据表列名创建动态属性,并将值设置为数据表中的动态属性。最后将数据绑定到gridview。
所以我决定按照以下步骤来实现这个功能(如果我错了,请告诉我)
我的数据表包含26行和10列数据
我已完成以下步骤
1
[Serializable]
public class A
{
public A()
{
}
}
2& 3。
DataTable dt = getData();
dynamic expando = new ExpandoObject();
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn col in dt.Columns)
{
var expandoDict = expando as IDictionary<String, Object>;
if (expandoDict.ContainsKey(col.ToString()))
expandoDict[col.ToString()] = row[col.ColumnName].ToString();
else
expandoDict.Add(col.ToString(), row[col.ColumnName].ToString());
}
}
执行上述for循环后,“expando”对象仅包含数据表的最后一行。
您能否帮我解决如何修复第2步到第5步的步骤。
答案 0 :(得分:6)
据我了解,此代码可能更符合您的要求。这应该将数据放入expandoList中。然后,您需要处理与GridView的绑定。
DataTable dt = getData();
List<dynamic> expandoList = new List<dynamic>();
foreach (DataRow row in dt.Rows)
{
//create a new ExpandoObject() at each row
var expandoDict = new ExpandoObject() as IDictionary<String, Object>;
foreach (DataColumn col in dt.Columns)
{
//put every column of this row into the new dictionary
expandoDict.Add(col.ToString(), row[col.ColumnName].ToString());
}
//add this "row" to the list
expandoList.Add(expandoDict);
}
答案 1 :(得分:1)
这是一个将数据表转换为动态对象列表的扩展方法:
public static class DataTableExtension
{
public static IEnumerable<dynamic> AsDynamicEnumerable(this DataTable table)
{
// Validate argument here..
return table.AsEnumerable().Select(row => new DynamicRow(row));
}
private sealed class DynamicRow : DynamicObject
{
private readonly DataRow _row;
internal DynamicRow(DataRow row) { _row = row; }
public override bool TryGetMember(GetMemberBinder binder, out object result)
{
var retVal = _row.Table.Columns.Contains(binder.Name);
result = retVal ? _row[binder.Name] : null;
return retVal;
}
}
}
用法:IEnumerable<dynamic> result = getData().AsEnumerable();