这样的“List<>集合”应该怎样绑定

starrycheng 2012-03-12 04:32:02
方法:
private static List<IDictionary<string, string>> DataTableToList(DataTable dt)
{
var list = new List<IDictionary<string, string>>();

foreach (DataRow row in dt.Rows)
{
list.Add(new Dictionary<string, string>
{
{"code_key",row.Field<string>("code_key").Trim()},
{"code_name",(row.Field<string>("code_name")??string.Empty).Trim().Replace("'","''")},
{"ref_val_1",(row.Field<string>("ref_val_1")??string.Empty).Trim().Replace("'","''")},
{"ref_val_2",(row.Field<string>("ref_val_2")??string.Empty).Trim().Replace("'","''")},
{"ref_val_3",(row.Field<string>("ref_val_3")??string.Empty).Trim().Replace("'","''")}
});
}

return list;
}

描述:
可以看出,方法是将“DataTable”结果集,转化为了“List<>集合”和“Dictionary<>集合”的组合,List<>就好比表,“Dictionary<>”就好比每一行的记录。

问题:这样的“结果集”该怎样作为数据源绑定呢?

比如“List<T>”可以这样的结果集,可以:
cb_chartType.ItemsSource = slcharttypes;
cb_chartType.SelectedValuePath = "Value";
cb_chartType.DisplayMemberPath = "Text";
cb_chartType.SelectedIndex = 0;

而现在“实体集对象”为“Dictionary”,它也是一个集合。要绑定的项也为一个“集合”,咋处理?

比如:现在想绑定“code_name”这一列,应该不能叫“列”了,应该叫“List集合”下每一项“Dictionary集合”的“code_name键”的值,应该怎么办???
...全文
250 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
shux02 2012-03-19
  • 打赏
  • 举报
回复
绑定是对一个实现IEnumerable接口的对象进行foreach循环,然后通过反射取得属性值。
所以实际应用中正常做法是采用匿名类即可
new {"code_key":row.Field<string>("code_key").Trim(),...}。
starrycheng 2012-03-19
  • 打赏
  • 举报
回复
[Quote=引用 14 楼 sp1234 的回复:]

引用 9 楼 starrycheng 的回复:
要用在“Silverlight”下的呢。


Silerlight根本没有DataTable,你的问题根本不成立。这说明你虽然猜到了问题所在,但是还没有真正动手去处理silverlight问题。
[/Quote]

看到大师的签名,Win8够呛啊。
kkgoose 2012-03-15
  • 打赏
  • 举报
回复
以前silverlight开发的时候用过list<list<string>>类型的变量,可以绑定,source指定为变量后,需要的字段好像用this.[index]还是this[index]绑定,不过这个要自己记住变量中字段的存放index
ruanwei1987 2012-03-15
  • 打赏
  • 举报
回复


看到 sp大神的签名,win8要败了?
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 starrycheng 的回复:]
要用在“Silverlight”下的呢。
[/Quote]

Silerlight根本没有DataTable,你的问题根本不成立。这说明你虽然猜到了问题所在,但是还没有真正动手去处理silverlight问题。
  • 打赏
  • 举报
回复
我自己写了一个方法,可以首先遍历List<IDictionary<string,object>>类型的数据,收集所有的列,然后动态使用Emit产生并动态编译一个临时的对象,然后再将这个List中每一行的词典值反射为这个动态产生的类型的对象实例,得到这个类型的对象列表。

这样就可以将这类灵活的数据绑定到控件。
  • 打赏
  • 举报
回复
“绑定”根本不认识 Dictionary<K,T> 个体,仅从这个类型(而不读取数据)根本找不到列,(目前)它如何绑定?

至少目前是不支持的。其实我也希望微软的程序员突然开窍,支持绑定 List<IDictionary<string,object>> 类型的数据,那样就可以方便许多开发引擎系统的聪明人士。不过我认为最近两年可能没戏。
yyz985 2012-03-15
  • 打赏
  • 举报
回复
Silverlight里面DataTable是精简版?
DENQH 2012-03-15
  • 打赏
  • 举报
回复
道生一,一生二,二生三,三生万物,修炼到一才是正道
starrycheng 2012-03-15
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 yyz985 的回复:]

DataTable设置主键,用起来和Dic一样简单的
[/Quote]

要用在“Silverlight”下的呢。
yyz985 2012-03-13
  • 打赏
  • 举报
回复
DataTable设置主键,用起来和Dic一样简单的
starrycheng 2012-03-13
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 viki117 的回复:]

呵呵,作为技术学习的确不错,实际中简单就是王道
[/Quote]
“对啊”简单才是王道。
viki117 2012-03-12
  • 打赏
  • 举报
回复
呵呵,作为技术学习的确不错,实际中简单就是王道
starrycheng 2012-03-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 luobinhacker 的回复:]

为什么不直接绑定DataTable呢,而要做一个这样的转换去绑定?
在进行数据绑定的时候,系统会取集合中项类型的属性作为字段数据,所以如果用List<Dictionary<string,string>>进行绑定的话,生成自动列时只会有Dictionary<string,string>的属性列。

看LZ上述的写的貌似字典里面的键也是固定的,是否可以用一个类去概括这些信息?
[/Quote]

对吭,可以用一个类来概括这些信息。
种草德鲁伊 2012-03-12
  • 打赏
  • 举报
回复
这个方法真是有够蛋疼的,直接用datatable不就好了
  • 打赏
  • 举报
回复
强类型的集合不能做数据源么?
  • 打赏
  • 举报
回复
貌似强类型的集合可以做数据源吧。
luobinhacker 2012-03-12
  • 打赏
  • 举报
回复
为什么不直接绑定DataTable呢,而要做一个这样的转换去绑定?
在进行数据绑定的时候,系统会取集合中项类型的属性作为字段数据,所以如果用List<Dictionary<string,string>>进行绑定的话,生成自动列时只会有Dictionary<string,string>的属性列。

看LZ上述的写的貌似字典里面的键也是固定的,是否可以用一个类去概括这些信息?

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧