码迷,mamicode.com
首页 > 其他好文 > 详细

VSTO学习之路:ListObject控件的复杂数据绑定初步

时间:2016-08-05 21:15:16      阅读:345      评论:0      收藏:0      [点我收藏+]

标签:

先做两个准备:一个实体类 +  一个集合            目标:把集合绑定到宿主控件(主要演示编程方式做绑定)。

public class Person
    {
        public string Name { get; set; }
        public int Age { get; set; }
        public char Gender { get; set; }
    }
1  public List<Person> PersonList()
2         {
3             List<Person> persons = new List<Person>();
4             persons.Add(new Person { Name = "张三", Age = 18, Gender =  });
5             persons.Add(new Person { Name = "李四", Age = 28, Gender =  });
6             persons.Add(new Person { Name = "赵花", Age = 16, Gender =  });
7             persons.Add(new Person { Name = "美丽", Age = 18, Gender =  });
8             return persons;
9         }

一、NamedRange:简单数据绑定

         技术分享

      NamedRange可以有许多单元格,因此看起来好像是进行复杂数据绑定的理想候选项(实际上不是)。使用其DataBindings属性以编程方式做数据绑定,这个属性是ControlBindindsCollection类型,有一个add方法,主要重载如下:

1 public void Add(Binding binding);
2 public Binding Add(string propertyName, object dataSource, string dataMember);

         如果只凭想像上面的图那样,命名范围三个列绑定PersonList的三个属性:name/age/gender,你发现做不到。因为NamedRange只有一个Value和一个Tag属性可以数据绑定。无法把name/age/gender重复绑定给Value或Tag(会抛异常),那样也没有任何意义。

 1 using System.Collections.Generic;
 2 using Excel = Microsoft.Office.Interop.Excel;
 3 using Microsoft.Office.Tools.Excel;
 4 using System.Windows.Forms;
 5 
 6 Excel.Range rng = hostsheet.InnerObject.Range["A1:C4"];
 7 NamedRange psrange = hostsheet.Controls.AddNamedRange(rng, "ps_namedrange");
 8 List<Person> ps = PersonList();
9
ControlBindingsCollection bindcollection = psrange.DataBindings; 11 Binding bind = new Binding("Value", ps, "Name"); 11 bindcollection.Add(bind);

       效果就像下图这样糟糕——它只显示了集合中的第一个对象的Name值“张三”,完全不是我们想要的。

        技术分享

二、ListObject:复杂数据绑定

      ListObject和数据绑定有关的属性图例:

      技术分享

      1、有一个可以做简单绑定的Tag属性,绑定方法和和NamedRange完全相同。

      2、DataSource属性可以直接获取数据。

      3、SetDataBinding方法做复杂数据绑定。

    使用DataSource取得数据:

 1 using System.Collections.Generic;
 2 using Excel = Microsoft.Office.Interop.Excel;
 3 using Microsoft.Office.Tools.Excel;
 4 using System.Windows.Forms;
 5 
 6 private void ThisAddIn_Startup(object sender, System.EventArgs e)
 7 {
 8     Worksheet hostsheet = Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveSheet);
 9     List<Person> ps = PersonList();
10     Excel.Range rng = hostsheet.InnerObject.Range["A1"];
11     ListObject pslist = hostsheet.Controls.AddListObject(rng, "pslist");
12     pslist.DataSource = ps; 
13 }

技术分享

      使用SetDataBinding取得数据:

      先看一下该方法的主要重载:

void SetDataBinding(object dataSource);
void SetDataBinding(object dataSource, string dataMember);
void SetDataBinding(object dataSource, string dataMember, params string[] mappedColumns);

      上面的代码只要做简单的更改即可:

 1 //生成宿主项
 2 Worksheet hostsheet = Globals.Factory.GetVstoObject(Globals.ThisAddIn.Application.ActiveSheet);
 3 List<Person> ps = PersonList();
 4  Excel.Range rng = hostsheet.InnerObject.Range["A1"];
 5 //生成宿主控件
 6 ListObject pslist = hostsheet.Controls.AddListObject(rng, "pslist");
 7 //数据绑定
 8 pslist.SetDataBinding(ps, "", "Name", "Age", "Gender");
 9 
10 //设置列表表头名称
11 pslist.ListColumns[1].Name = "姓名";
12 pslist.ListColumns[2].Name = "年龄";
13 pslist.ListColumns[3].Name = "性别";

     本例设置了列表的表头名称,效果如图有了表头:

      技术分享

     

VSTO学习之路:ListObject控件的复杂数据绑定初步

标签:

原文地址:http://www.cnblogs.com/zzstone/p/5742491.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!