标签:
先做两个准备:一个实体类 + 一个集合 目标:把集合绑定到宿主控件(主要演示编程方式做绑定)。
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