类如何与界面绑定
准确的说应该是用户自定类的对象如何与界面元素绑带。在.Net中Dataset、DataTable等可以与Datagrid绑定,Dataset、DataTable中的数据就会自动的填充到Datagrid中,而当用户修改了Datagrid中的数据,这些数据会自动的更新Dataset、DataTable中的数据,这样的数据绑定功能令很多人羡慕不已。很多情况我们并不直接使用Dataset、DataTable等进行数据访问,我们往往是将业务封装在类中,通过类和界面交互。这种情况下数据通过界面传递给类的属性,在类中将这些数据保存到数据库中,三层体系结构中往往是这样的。为了和界面进行数据交互我们通过对象或者对象数组或者装满对象的ArrayList。如果是单行数据的交互通过对象来完成,如果是多行数据通过对象数组或者ArrayList来完成。ArrayList可以看作是动态数组,我本人比较希望使用ArrayList而不是对象数组。这样对象或者ArrayList中数据往界面上填充的时候,我们需要写代码将他们中的数据一个读出来填充到界面元素中。当需要进行保存、新建、修改等操作的时候我们又需要将界面上的数据赋值给对象或者ArrayList。很明显这样的处理方式与Dataset和Datagrid绑定的方式相比,复杂了很多。我们就在思考使用对象能够实现和界面元素的绑定呢?当然可以,很多人听到这个回答很兴奋。到底如何实现呢?
1、简单绑定
我们可以对象或者ArrayList和文本框、标签等等这些只能显示一行一列的界面元素进行绑定。为了演示的效果比较好,我们使用如下的一个User类。
下面的代码演示了我们将User类的对象user和文本框进行了绑定。我们可以在Form_Load中写这样的代码实现
其中Property为控件的属性,数据源,数据源中的某个属性
当使用ArrayList和文本框绑定时仅仅将ArrayList的第一个值取出和控件绑定(如果这个ArrayList同时也绑定了一个ListBox,当选中不同的User时,文本框中的内容会自动发生相应的变化)。这样修改了控件的值对象中的属性就会自动修改。
2、复杂绑定
象ListBox、ComoBox等这一类可以显示一列多行的控件,可以绑定对象数组或者ArrayList,不能绑定单个对象。我们可以使用如下的方式将ListBox和ArrayList绑定,对象数组类似。
DisplayMember:要显示的数据源中的一个属性
ValueMember:确定在数据源中用哪一个属性,与DisplayMember对应。
通常我们使用DisplayMember来加载要显示的属性,使用ValueMember来隐含加载主键。
3 、Datagrid
Datagrid的特定就是可以加载多行多列。将对象数组或者ArrayList加载到Datagrid中的方式和Dataset类似。
dataGrid1.DataSource=user.GetAllUser();
这样ArrayList中的所有数据将全部加载到DataGrid中。
总结:通过以上说明我们便发现原来在.Net中类也是可以完全和界面元素进行绑定,这样我们就没有必要一味的追求使用Dataset了,当然Dataset有很多它的优势,该使用的时候还是要使用。另外根据MSDN的意思Listview、TreeView也可以使用绑定,但是本人尝试了很久,也没有成功,如何有知道的请告诉我一下,谢谢。
1、简单绑定
我们可以对象或者ArrayList和文本框、标签等等这些只能显示一行一列的界面元素进行绑定。为了演示的效果比较好,我们使用如下的一个User类。
public class User
{
public User()
{
}
public User(int vAge,string vName)
{
_Age=vAge;
_Name=vName;
}
private int _Age;
private string _Name;
public int Age
{
set{_Age=value;}
get{return _Age;}
}
public string Name
{
set{_Name=value;}
get{return _Name;}
}
//查询所有的用户通过ArrayList返回
public ArrayList GetAllUser()
{
string strSQL="Select * from User";
//CommonDAL是我们封装的执行执行SQL语句的类
SqlDataReader dr=CommonDAL.ExecuteReader(strSQL);
ArrayList al=new ArrayList();
while(dr.Read())
{
al.Add(new User(dr.GetInt32(0),dr.GetString(1)));
}
return al;
}
{
public User()
{
}
public User(int vAge,string vName)
{
_Age=vAge;
_Name=vName;
}
private int _Age;
private string _Name;
public int Age
{
set{_Age=value;}
get{return _Age;}
}
public string Name
{
set{_Name=value;}
get{return _Name;}
}
//查询所有的用户通过ArrayList返回
public ArrayList GetAllUser()
{
string strSQL="Select * from User";
//CommonDAL是我们封装的执行执行SQL语句的类
SqlDataReader dr=CommonDAL.ExecuteReader(strSQL);
ArrayList al=new ArrayList();
while(dr.Read())
{
al.Add(new User(dr.GetInt32(0),dr.GetString(1)));
}
return al;
}
下面的代码演示了我们将User类的对象user和文本框进行了绑定。我们可以在Form_Load中写这样的代码实现
//对象和控件绑定
User user=new User(10,"Tom");
txtAge.DataBindings.Add("Text",user,"Age");
txtUser.DataBindings.Add("Text",user,"User");
//ArrayList和控件绑定
txtAge1.DataBindings.Add("Text",user.GetAllUser(),"Age");
{Controls}.DataBindings.Add("{Property}",{dataSource},"{dataMember}");User user=new User(10,"Tom");
txtAge.DataBindings.Add("Text",user,"Age");
txtUser.DataBindings.Add("Text",user,"User");
//ArrayList和控件绑定
txtAge1.DataBindings.Add("Text",user.GetAllUser(),"Age");
其中Property为控件的属性,数据源,数据源中的某个属性
当使用ArrayList和文本框绑定时仅仅将ArrayList的第一个值取出和控件绑定(如果这个ArrayList同时也绑定了一个ListBox,当选中不同的User时,文本框中的内容会自动发生相应的变化)。这样修改了控件的值对象中的属性就会自动修改。
2、复杂绑定
象ListBox、ComoBox等这一类可以显示一列多行的控件,可以绑定对象数组或者ArrayList,不能绑定单个对象。我们可以使用如下的方式将ListBox和ArrayList绑定,对象数组类似。
lstName.DataSource=user.GetAllUser();
lstName.DisplayMember="Age";
lstName.ValueMember="Age";
DataSource=支持实现了IList的对象(即数据源)lstName.DisplayMember="Age";
lstName.ValueMember="Age";
DisplayMember:要显示的数据源中的一个属性
ValueMember:确定在数据源中用哪一个属性,与DisplayMember对应。
通常我们使用DisplayMember来加载要显示的属性,使用ValueMember来隐含加载主键。
3 、Datagrid
Datagrid的特定就是可以加载多行多列。将对象数组或者ArrayList加载到Datagrid中的方式和Dataset类似。
dataGrid1.DataSource=user.GetAllUser();
这样ArrayList中的所有数据将全部加载到DataGrid中。
总结:通过以上说明我们便发现原来在.Net中类也是可以完全和界面元素进行绑定,这样我们就没有必要一味的追求使用Dataset了,当然Dataset有很多它的优势,该使用的时候还是要使用。另外根据MSDN的意思Listview、TreeView也可以使用绑定,但是本人尝试了很久,也没有成功,如何有知道的请告诉我一下,谢谢。