使用DataTable创建ExpandoObject

3
我是新手,正在学习C#,在Stackoverflow.com上查看了很多问题,但没有找到符合我需求的解决方案。所以我最终决定在这里发帖求助。
我的需求是从DataTable列名创建动态属性,并从DataTable设置属性值。最后将数据绑定到GridView。
因此,我决定按照以下步骤实现此功能(如果我有错误,请纠正我):
我的DataTable包含26行和10列的数据
  1. 创建一个A类
  2. 从DataTable(列名)向A添加动态属性
  3. 设置A的属性值
  4. 将类A转换为A列表
  5. 将A列表绑定到GridView
我已经完成以下步骤:

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。


1
你基本上有一个字典。每次循环,你都会找到列的名称,并将其用作键。然后,你重新分配该键处的值为该行中该列的值。在我看来,你真正想要的是ExpandoObject列表而不是单个对象。每个内部循环都应该向该列表添加另一个ExpandoObject,而不是在同一对象上重新分配值。 - user1304444
2个回答

8
据我所了解,这段代码可能更符合您的需求。这将为您获取数据并将其存储在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);
}

非常感谢user1304444的帮助。我会想办法将List<dynamic>绑定到gridview。 - Naren
实际上,我正在代码后台绑定所有列。将AutoGenerateColumns="false"关闭。在绑定expandoList时,gridview无法在List<Dictionary<Key, Value>>下找到列名。有什么线索吗? - Naren

2
这是一个扩展方法,可以将您的数据表转换为动态对象列表:
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();


我无法构建这个语句。IEnumerable<dynamic> = dt.AsEnumerable(); 出现“只有赋值、调用、增量、减量、等待和新对象表达式可以用作语句”的错误提示。 - Naren
我忘记定义变量名了。请查看更新后的答案。 - vendettamit
知道了。谢谢。 - Naren

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接