微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

DataGrid动态绑定,既不知道Class的结构

 

   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","女","华中科技大学" });
list.Add(new string[] { "3","zhuxi","黄埔军校"});
心神不宁的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","黄埔军校"});
bingclass = new BingClass();
relist = bingclass.columndisplay(dataGrid1,list);       

The Last   

datagird

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐