自定义可绑定数据的业务对象实体和强类型-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).


图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,正如你可以从下面代码看到的.

private void CustomerAdmin_Load(object sender, EventArgs e)
{
    
//--- 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事件,并且,添加如下代码.

private void ordersDataGridView_CellFormatting(object sender, DataGridViewCellFormattingEventArgs e)
{
    
//--- 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;

posted @ 2008-01-22 19:38 mickeysuda 阅读(...) 评论(...) 编辑 收藏