原文及代码附件地址:http://www.dingos.cn/index.php?topic=1034.0
Windows Forms 数据绑定就是控件绑定到某个数据源,可以通过控件来显示和编辑数据。
Windows Forms 数据绑定可以分为两种类型:简单的数据绑定和复杂的数据绑定。
【简单的数据绑定】
简单的数据绑定是将用户控件的某一个属性绑定至某一个类型实例上的某一属性。
【复杂的数据绑定】
复杂的数据绑定是将一个以列表为基础的用户控件(例如:ComboBox、ListBox、ErrorProvider、DataGridView等控件)绑定至一个数据对象的列表。例如,可以将一个ComboBox控件绑定到一个DataTable中的多行数据记录上。
与简单的数据绑定类似,复杂的数据绑定通常也是双向变更的。也就是说,对用户控件所做的变更会反应至数据列表中,而对数据列表所做的变更也会反映至用户控件中。
基本上,Windows Forms的复杂数据绑定允许绑定至支持IList接口的数据列表。此外,如果想通过一个BindingSource组件进行绑定,还可以绑定至一个支持IEnumerable接口的数据列表。
Windows Forms 数据绑定可以分为两种类型:简单的数据绑定和复杂的数据绑定。
【简单的数据绑定】
简单的数据绑定是将用户控件的某一个属性绑定至某一个类型实例上的某一属性。
控件.DataBindings.Add("控件属性", 实例对象, "属性名", true);
【复杂的数据绑定】
复杂的数据绑定是将一个以列表为基础的用户控件(例如:ComboBox、ListBox、ErrorProvider、DataGridView等控件)绑定至一个数据对象的列表。例如,可以将一个ComboBox控件绑定到一个DataTable中的多行数据记录上。
与简单的数据绑定类似,复杂的数据绑定通常也是双向变更的。也就是说,对用户控件所做的变更会反应至数据列表中,而对数据列表所做的变更也会反映至用户控件中。
基本上,Windows Forms的复杂数据绑定允许绑定至支持IList接口的数据列表。此外,如果想通过一个BindingSource组件进行绑定,还可以绑定至一个支持IEnumerable接口的数据列表。
【简单的数据绑定示例】编写一个Student类,将Student实例的属性绑定到TextBox控件的Text属性。
绑定属性后,对TextBox.Text属性所做的变更将会反应到Student实例的属性;针对Student的属性所做的更改也会反应到TextBox.Text属性。
★ 编写Student类
★ 在窗体中声明一个Student类的变量
★ 在窗体的Load事件中建立Student对象。然后将窗体上的TextBox控件的Text属性分别绑定到Student的StuNO、StuName、StuAge属性
★ 在窗体上创建一个按钮,为其添加Click事件,用于显示Student对象的属性
绑定属性后,对TextBox.Text属性所做的变更将会反应到Student实例的属性;针对Student的属性所做的更改也会反应到TextBox.Text属性。
★ 编写Student类
public class Student {
public Student() {
}
public Student(string stuNO, string stuName, int stuAge) {
this.StuAge = stuAge;
this.StuNO = stuNO;
this.StuName = stuName;
}
string stuNO;
public string StuNO {
get {
return stuNO;
}
set {
stuNO = value;
}
}
string stuName;
public string StuName {
get {
return stuName;
}
set {
stuName = value;
}
}
int stuAge;
public int StuAge {
get {
if(stuAge < 0 || stuAge >= 80)
return 18;
return stuAge;
}
set {
stuAge = value;
}
}
}
}
public Student(string stuNO, string stuName, int stuAge) {
this.StuAge = stuAge;
this.StuNO = stuNO;
this.StuName = stuName;
}
string stuNO;
public string StuNO {
get {
return stuNO;
}
set {
stuNO = value;
}
}
string stuName;
public string StuName {
get {
return stuName;
}
set {
stuName = value;
}
}
int stuAge;
public int StuAge {
get {
if(stuAge < 0 || stuAge >= 80)
return 18;
return stuAge;
}
set {
stuAge = value;
}
}
}
★ 在窗体中声明一个Student类的变量
private Student stu;
★ 在窗体的Load事件中建立Student对象。然后将窗体上的TextBox控件的Text属性分别绑定到Student的StuNO、StuName、StuAge属性
private void FormDataBinding_Load(object sender, EventArgs e) {
stu = new Student("F034", "学生", 20);
this.txtStuAge.DataBindings.Add("Text", stu, "StuAge", true);
this.txtStuName.DataBindings.Add("Text", stu, "StuName", true);
this.txtStuNo.DataBindings.Add("Text", stu, "StuNO", true);
}
this.txtStuAge.DataBindings.Add("Text", stu, "StuAge", true);
this.txtStuName.DataBindings.Add("Text", stu, "StuName", true);
this.txtStuNo.DataBindings.Add("Text", stu, "StuNO", true);
}
★ 在窗体上创建一个按钮,为其添加Click事件,用于显示Student对象的属性
private void btnShowStuInfo_Click(object sender, EventArgs e) {
MessageBox.Show(stu.StuAge + "/t" + stu.StuName + "/t" + stu.StuNO);
}
}
【复杂的数据绑定示例】使用复杂的数据绑定,将DataGridView控件绑定至一个含有数个Student对象的泛型集合对象BindingList中。
★ 在窗体的Load事件中创建BindingList来包含多个Student对象,并绑定到DataGridView控件中。
private void FormDataBinding_Load(object sender, EventArgs e) {
★ 在窗体的Load事件中创建BindingList来包含多个Student对象,并绑定到DataGridView控件中。
private void FormDataBinding_Load(object sender, EventArgs e) {
BindingList<Student> blc = new BindingList<Student>();
blc.Add(new Student("F0812", "学生1", 20));
blc.Add(new Student("F0814", "学生2", 22));
blc.Add(new Student("F0815", "学生3", 19));
dgvShowData.DataSource = blc;
}
blc.Add(new Student("F0812", "学生1", 20));
blc.Add(new Student("F0814", "学生2", 22));
blc.Add(new Student("F0815", "学生3", 19));
dgvShowData.DataSource = blc;
}
【在控件上使用简单的数据绑定】
简单的数据绑定可以分为下列两种形式:
★ 第一种形式是属性对属性的绑定,例如将TextBox控件的Text属性绑定至对象的某一个属性。
★ 第二种形式是将一个属性绑定到列表中某一个属性。例如,将来一个支持数据绑定的泛型集合对象BindingList包含多个对象,然后将TextBox控件的Text属性绑定至泛型集合对象BindingList中的对象的特定属性上。
基本上,这两种形式的绑定是完全相同的,唯一的差异是在第二种形式中,数据源时项目列表而不是单一项目。当使用简单的数据绑定来绑定至一个控件时,Windows Forms数据绑定执行阶段会将用户控件属性绑定至列表所包含的某一个项目上的属性上。在默认状态下,执行阶段会绑定至列表中的第一个项目上。如果用一个列表被另外一个控件使用复杂的数据绑定来加以绑定,则Windows Forms执行阶段会自动进行当前项的处理。
例如,使用简单的数据绑定将TextBox控件的Text属性绑定至Student对象列表的属性,然后又使用复杂的数据绑定将DataGridView控件绑定至相同的Student对象列表。这样,当用户在DataGridView空间中选取不同的Student对象时,TextBox控件的Text属性将会自动重新绑定至DataGridView控件中当前选取的Student对象的属性(也就是,TextBox控件会显示出被选取的Student对象的属性值)。
简单的数据绑定可以分为下列两种形式:
★ 第一种形式是属性对属性的绑定,例如将TextBox控件的Text属性绑定至对象的某一个属性。
★ 第二种形式是将一个属性绑定到列表中某一个属性。例如,将来一个支持数据绑定的泛型集合对象BindingList包含多个对象,然后将TextBox控件的Text属性绑定至泛型集合对象BindingList中的对象的特定属性上。
基本上,这两种形式的绑定是完全相同的,唯一的差异是在第二种形式中,数据源时项目列表而不是单一项目。当使用简单的数据绑定来绑定至一个控件时,Windows Forms数据绑定执行阶段会将用户控件属性绑定至列表所包含的某一个项目上的属性上。在默认状态下,执行阶段会绑定至列表中的第一个项目上。如果用一个列表被另外一个控件使用复杂的数据绑定来加以绑定,则Windows Forms执行阶段会自动进行当前项的处理。
例如,使用简单的数据绑定将TextBox控件的Text属性绑定至Student对象列表的属性,然后又使用复杂的数据绑定将DataGridView控件绑定至相同的Student对象列表。这样,当用户在DataGridView空间中选取不同的Student对象时,TextBox控件的Text属性将会自动重新绑定至DataGridView控件中当前选取的Student对象的属性(也就是,TextBox控件会显示出被选取的Student对象的属性值)。
【数据绑定示例】建立了一个泛型集合对象BindingList包含多个Student对象,使用复杂的数据绑定将DataGridView控件绑定至泛型集合对象BindingList,使用简单的数据绑定将各个TextBox控件的Text属性绑定至泛型集合对象BindingList,并使用简单的数据绑定将各个TextBox控件的Text属性绑定至泛型集合对象BindingList中的Student对象的特定的属性。
在这种情况下,Windows Forms执行阶段会自动进行同步处理,即当对DataGridView控件中选取不同的Student对象是,TextBox控件的Text属性就会自动重新绑定至DataGridView控件中当前选取的Student对象的属性,而使得TextBox控件会显示出被选取的Student对象的属性值。
★ 在窗体的Load事件中处理
在这种情况下,Windows Forms执行阶段会自动进行同步处理,即当对DataGridView控件中选取不同的Student对象是,TextBox控件的Text属性就会自动重新绑定至DataGridView控件中当前选取的Student对象的属性,而使得TextBox控件会显示出被选取的Student对象的属性值。
★ 在窗体的Load事件中处理
BindingList<Student> blc = new BindingList<Student>();
blc.Add(new Student("F0812", "学生1", 20));
blc.Add(new Student("F0814", "学生2", 22));
blc.Add(new Student("F0815", "学生3", 19));
dgvShowData.DataSource = blc;
this.txtStuAge.DataBindings.Add("Text", blc, "StuAge", true);
this.txtStuName.DataBindings.Add("Text", blc, "StuName", true);
this.txtStuNo.DataBindings.Add("Text", blc, "StuNO", true);
blc.Add(new Student("F0814", "学生2", 22));
blc.Add(new Student("F0815", "学生3", 19));
dgvShowData.DataSource = blc;
this.txtStuAge.DataBindings.Add("Text", blc, "StuAge", true);
this.txtStuName.DataBindings.Add("Text", blc, "StuName", true);
this.txtStuNo.DataBindings.Add("Text", blc, "StuNO", true);
简单数据绑定:适用于所有控件,这是数据源到控件特定属性间的一个关联,如TextBox等的绑定。它使用Binding类。
string s = "Hello world";
Binding bind = new Binding("Text", s, null);
txtName.Bindings.Add(bind);
txtName.Bindings.Add(bind);
string[] s = {"Hello", "world"};
txtName.Bindings.Add("Text", s, null); //一次显示一项
txtName.Bindings.Add("Text", myds, "Customer.custID");
或:txtName.Bindings.Add("Text",myds.Customer, "custID");
Binding bind=txtName.DataBindings["Text"];
BindingManagerBase man=binding.BindingManagerBase;
++man.Position; //把数据下移一条,不担心超出范围
++man.Position; //把数据下移一条,不担心超出范围
复杂数据绑定:适用于ListBox, ComboBox, DataGridView等。对于复杂绑定,控件本身要提供支持
这些控件都有一属性指定数据源(DataSource),并有属性指定数据成员。列表控件必须至少设置DataSource和DisplayMember属性,如ListBox,CheckListBox, ComboxBox都提供了如下属性:
这些控件都有一属性指定数据源(DataSource),并有属性指定数据成员。列表控件必须至少设置DataSource和DisplayMember属性,如ListBox,CheckListBox, ComboxBox都提供了如下属性:
- DataSource: 实现IList的数据源,如数组,DataSet等
- DisplayMember: 要显示的数据源属性(默认为ValueMember,设置的情况下,是ToString方法的结果)
- ValueMember: 列表控件把它用作SelectedValue属性值
lstName.DataSource=myds;
lstName.DisplayMember = "Customer.custName";