日期:2014-05-18  浏览次数:20913 次

这样的“List<>集合”应该怎样绑定
方法:
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键”的值,应该怎么办???

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

看LZ上述的写的貌似字典里面的键也是固定的,是否可以用一个类去概括这些信息?
------解决方案--------------------
貌似强类型的集合可以做数据源吧。
------解决方案--------------------
强类型的集合不能做数据源么?
------解决方案--------------------
这个方法真是有够蛋疼的,直接用datatable不就好了
------解决方案--------------------
呵呵,作为技术学习的确不错,实际中简单就是王道
------解决方案--------------------
DataTable设置主键,用起来和Dic一样简单的
------解决方案--------------------
道生一,一生二,二生三,三生万物,修炼到一才是正道
------解决方案--------------------
Silverlight里面DataTable是精简版?
------解决方案--------------------
“绑定”根本不认识 Dictionary<K,T> 个体,仅从这个类型(而不读取数据)根本找不到列,(目前)它如何绑定?

至少目前是不支持的。其实我也希望微软的程序员突然开窍,支持绑定 List<IDictionary<string,object>> 类型的数据,那样就可以方便许多开发引擎系统的聪明人士。不过我认为最近两年可能没戏。
------解决方案--------------------
我自己写了一个方法,可以首先遍历List<IDictionary<string,object>>类型的数据,收集所有的列,然后动态使用Emit产生并动态编译一个临时的对象,然后再将这个List中每一行的词典值反射为这个动态产生的类型的对象实例,得到这个类型的对象列表。

这样就可以将这类灵活的数据绑定到控件。
------解决方案--------------------
探讨
要用在“Silverlight”下的呢。

------解决方案--------------------


看到 sp大神的签名,win8要败了?
------解决方案--------------------
以前silverlight开发的时候用过list<list<string>>类型的变量,可以绑定,source指定为变量后,需要的字段好像用this.[index]还是this[index]绑定,不过这个要自己记住变量中字段的存放index
------解决方案--------------------