2011-09-26 11:21
300人阅读
评论 (0)
收藏
举报
分类:
silverlight(9)
datagrid是silverlight中相对独立且相对复杂的控件。
正常使用过程中 我们需要明确一个具体的类结构如下
public class BasicInfo
{
public string id { set; get; }
public string name { set; get; }
public string tel { set; get; }
}
如果DataGrid是AutoGenerateColumns="True" 则只需要绑定 DataGrid.ItemsSource = List<BasicInfo>
则出现以id,name,tel为列头的列表。这个很明显不符合中文开发者使用,至少id,name肯定得是明确表达意义的中文名。
如果AutoGenerateColumns="False" 则可以自行定制列头内容,但不管怎样,我们都需要一个固定的类如上BasicInfo类。
我接触DataGrid的时候我不能有明确的类,因为我的值取自数据库 中动态的表。不确定表名,不确定字段名,和字段个数。
用一段代码来描述 我希望我的DataGird绑定的数据能像下面的代码那样简单
list.Add(new string[] {"ID", "姓名", "年龄", "性别","毕业院校" });
list.Add(new string[] {"1","zhangli","19","男","武汉大学"});
list.Add(new string[] { "2","liuli", "19", "女","华中科技大学" });
list.Add(new string[] { "3","zhuxi", "19", "女" ,"黄埔军校"});
心神不宁的Google一番后
http://www.cnblogs.com/Ivan-Yan/archive/2009/05/27/1490667.html 此人博客‘通过
IDictionary对Silverlight DataGrid 进行动态数据绑定 ’貌似可以解决我一部分需求 但他的方法还是xaml部分太固定。列个数 列头,绑定字段都不太自由。
万能绑定类
public class BingClass : IEditableObject //实现这个接口的目的是需要在界面被编辑时处理一些事件
{
public String key0 { get; set; }
public string key1 {get;set;}
public String key2{get;set;}
………
public String key19{get;set;}
以下可能足够长, 我的需求不超过20个字段,可以放心 这些字段不必要全部初始化 留null不会占用内存空间。
public String[] keyarr = new string[20]; //这个集合保存上面所有key0~key19的引用
public string[] keystrarr = //属性的字符表示
{
"key0","key1","key2","key3","key4","key5","key6","key7","key8","key9",
"key10","key11","key12","key13","key14","key15","key16","key17","key18","key19"
};
很重要的refresh方法
public void refresh()
{
key0 = keyarr[0]; key1 = keyarr[1]; key2 = keyarr[2]; key3 = keyarr[3]; key4 = keyarr[4];
key5 = keyarr[5]; key6 = keyarr[6]; key7 = keyarr[7]; key8 = keyarr[8]; key9 = keyarr[9];
key10 = keyarr[10]; key11 = keyarr[11]; key12 = keyarr[12]; key13 = keyarr[13]; key14 = keyarr[14];
key15 = keyarr[15]; key16 = keyarr[16]; key17 = keyarr[17]; key18 = keyarr[18]; key19 = keyarr[19];
}
绑定数据
public List<BingClass> columnDisplay(DataGrid grid, List<string[]> list)
{
List<BingClass> relist = new List<BingClass>(); //需要经过一系列讲List<string[]> 转换为List<BingClass>
for (int num = 0; num < list[0].Length; num++)
{
//DataGridTextColumn 在C#中定义,使xaml自由一点
DataGridTextColumn column = new DataGridTextColumn();
Binding binding = new Binding(keystrarr[num]); //这部分很重要 定义该列绑定指定的属性列
grid.FrozenColumnCount = 1;
binding.Mode = BindingMode.TwoWay;
column.Binding = binding;
column.Header = list[0][num]; //注意我的list第一行是中文字段名用作DataGird列名
grid.Columns.Add(column);
}
for (int i = 1; i < list.Count; i++) //List<string[]> 转换为List<BingClass>
{
string[] strs = list[i];
BingClass bing = new BingClass();
for (int j = 0; j < strs.Length; j++)
{
bing.keyarr[j] = strs[j];
}
bing.refresh(); //很重要,使集合中的值赋给各个key属性
relist.Add(bing);
}
grid.ItemsSource = relist; //费这么大功夫就为了这一行……
return relist;
}
使用
list.Add(new string[] {"ID", "姓名", "年龄", "性别","毕业院校" });
list.Add(new string[] {"1","zhangli","19","男","武汉大学"});
list.Add(new string[] { "2","liuli", "19", "女","华中科技大学" });
list.Add(new string[] { "3","zhuxi", "19", "女" ,"黄埔军校"});
bingclass = new BingClass();
relist = bingclass.columnDisplay(dataGrid1, list);
The Last