今天写的程序原来是想用 DataBinding, DataSource, ValueMember, DisplayMember 属性来直接绑定表的,但是如果那样做的话就是让界面层直接和数据进行了对话。而我力求让代码清晰,结构明确。所以我希望它能绑定到逻辑层上的一个我自定义的 RecordCollection 上。所以我让它实现了 IList。在 DataSource 上设定了它的实例。再指定 DisplayMember。OK!
定义一个 RecordCollection 的实例 records。RecordCollection 里包含类型为 Record 的 n 个实例。ServiceName 为 Record 类的一个 string 属性。窗口上有一个 ListBox 的实例 lstbRecords。
lstbRecords.DataSource
=
records;
lstbRecords.DisplayMember = " ServiceName " ;
这样这个 ListBox 就可以直接显示和修改 records 了。比你在构造函数里写上一大串的 foreach, for,然后还要在各个事件里处理数据方便多了。
lstbRecords.DisplayMember = " ServiceName " ;
如果你的界面是那种一个窗口下用很多 label, textbox, combox 之类显示一条记录的传统窗口,那个你会用到 DataBinding 属性的。例如:
this
.lblID.DataBindings.Add(
"
Text
"
,
this
.record,
"
ID
"
);
this .txtServiceName.DataBindings.Add( " Text " , this .record, " ServiceName " );
this .txtUserName.DataBindings.Add( " Text " , this .record, " UserName " );
this .txtPassword.DataBindings.Add( " Text " , this .record, " Password " );
this .cmbCategory.DataBindings.Add( " Text " , this .record, " Category " );
this .txtNote.DataBindings.Add( " Text " , this .record, " Note " );
this .txtUrl.DataBindings.Add( " Text " , this .record, " WebSite " );
这里面的 this.record 就是一个 Record 类的实例。什么 ID, ServiceName 之类的都是 string 属性。这里提醒你一下,如果你的属性是只读的,也就是说没有定义 set 访问器,那么你的窗口将没有更改数据的能力。
this .txtServiceName.DataBindings.Add( " Text " , this .record, " ServiceName " );
this .txtUserName.DataBindings.Add( " Text " , this .record, " UserName " );
this .txtPassword.DataBindings.Add( " Text " , this .record, " Password " );
this .cmbCategory.DataBindings.Add( " Text " , this .record, " Category " );
this .txtNote.DataBindings.Add( " Text " , this .record, " Note " );
this .txtUrl.DataBindings.Add( " Text " , this .record, " WebSite " );