自定义可绑定数据的业务对象实体和强类型-Part Four
步骤三 : 创建表现层
在Windows窗体中呈现数据
好吧,既然我们完成了所有的用于数据层(DataLayer)和业务层(BusinessLayer)的管道代码,我们要将业务数据呈现到表现层中.你会注意到层中分离的逻辑,不会只是使得代码更加容易维护,而且,向开发周期中添加了更多的转换过程,这意味着呈现层的代码编写者的学习曲线在时间上打折,因为呈现层代码编写者不需要注意到其他层次的实现细节(数据业务),他可以只抓取存在的做好的自定义对象,并且把精力集中于在表现层中呈现它们.
首先要做的是添加一个新的工程,这次,我们讨论的是Windows程序.所以,开始添加一个新的工程到解决方案中,并且命名为"DCAF.PresentationLayer",重新命名"Form1"类为"CustomerAdmin".
在这个演示中,我想呈现我们的customers和相关的orders,一个栅格中每个关联到其它的.因此,呈现层程序员首先要做的是添加一个DataSource到工程中,你可以通过选择"数据",接着在菜单上选择"添加新数据源..."(如图7).
图7.添加一个新的DataSource到工程中
接着,选择对象作为数据源(如图8),并且单击"下一步"按钮.
图8.添加一个对象数据源
下一步,我们必须选择作为数据源的对象的位置,这意味着我们必须添加一个到我们的业务层(BusinessLayer)集合的引用!单击"添加引用"选择这个点(如图9).
图9.添加一个到对象位置集合的引用
接着,你必须从工程标签中选择"DCAF.BusinessLayer"集合(如图10).
图10.选择集合引用
接着,我们必须选择我们要绑定的对象.在这一步选择"CustomerBO"(如图11).
图11.选择数据绑定的对象
最后单击"下一步",然后"完成".注意到,一个"DataSources"文件夹已经添加到我们的表现层工程的"Properties"目录中了(如图12).
图12.表现层的嵌入的DataSources
好吧!既然我们已经将我们的数据添加到了工程中,我们将为我们的Customer和Order业务对象(BusinessObject)添加对象实例.因此,首先从"数据"菜单中选择"显示数据源"(如图13).
你可以看到(如图14),左边的"数据源"面板给我们展示了"CustomerBO"对象.从这一点上,先选择"CustomerBO"栅格图标,并且拖到窗体上,然后对"Orders"栅格图标做相同的动作.
图14.数据源面板
最后,窗体将会如下面的样子显示出来(如图15).
图15.初始的对象绑定Customer窗体
难道这不是VS的IDE的一个令人激动的功能增强吗?
IDE不仅添加了我们的栅格,而且还有一个bindingnavigator,customerbindingsource和orderbindingsource(如图16),正好在盒子外!默认CustomerGrid.DataSource绑定到customerBOBindingSource,OrderGrid.DataSource绑定到ordersBindingSource,并且,customerBOBindingNavigator.DataSource绑定到customerBOBindingSource.
图16.绑定工具
因此,留下给UI程序员做的就是,从我们的CustomerBO取得数据,并且绑定合适的BindingSources,正如你可以从下面代码看到的.
{
//--- Get the data through the static method of our CustomerBO
customerBOBindingSource.DataSource = DCAF.BusinessLayer.CustomerBO.GetCustomerOrders();
//--- DataBind the BindingSources
ordersBindingSource.DataSource = customerBOBindingSource;
ordersBindingSource.DataMember = "Orders";
}
现在,按下"F5"的同时大笑吧!你从结果(如图17)中会看到,我们的栅格居然稳稳地加载了.选择另一个customer,你会看到,order栅格自动适配它的绑定,来反映出正确的数据!
图17.客户管理
你可以从Order栅格看到,我们仍然留下了一个小问题.对于Customer列,我们想看到的是CustomerID而不是Customer对象类型的定义.栅格显示Customer对象类型定义的原因,应该归结为绑定列的特性.如果你打开Order栅格的栅格属性,并且选择列(集合Collection)属性,然后你会看到列是绑定到Order对象中的Customer对象引用的的实例的.现在,如果我们想去使一些"有意义"的数据在列中显示,比方说CustomerID,我们需要订阅Order栅格的CellFormatting事件,并且,添加如下代码.
{
//--- Display CustomerID instead of CustomerObject
if (ordersDataGridView.Columns[e.ColumnIndex].DataPropertyName == "Customer")
{
object currentCustomer = customerBOBindingSource.Current;
PropertyDescriptorCollection props = TypeDescriptor.GetProperties(currentCustomer);
PropertyDescriptor propDesc = props.Find("CustomerID", true);
try
{
e.Value = propDesc.GetValue(currentCustomer).ToString();
}
catch
{
e.Value = "[Undefined]";
}
}
}
调整好代码,如果你再次运行程序,你会发现,只有CustomerID列被绑定了!(如图18)
图18.Customer管理增强
自此, 基本上就剩最后一个部分没有发布了, 刚才来回几次上传本Part Four的图片, 好多张, 一张一张传的, 网速又慢, 几乎崩溃到Faint;