代码改变世界

XPO学习(4)----一个WINFROM的数据编辑应用程序

2011-10-18 16:51  OOA  阅读(1012)  评论(2编辑  收藏  举报

在这一节, 我们将学会应用 XPO事务、DAL,xpView 控件。

任务:

1.在主窗体显示的客户名称和公司名称 为 只读的。

2.用户只能修改客户详情。在双击记录的时候,弹出一个模态对话框来编辑客户的详情。

3.在点击"保存"按钮的时候 就把所有的更改保存到数据库,点击”取消“(或者esc键)按钮就可以取消所有的更改。

4.数据库为Acces数据库,并且放在”C:\DataBase\“目录下。

解决方案:

1.先定义一个持久化对象类”Customer“类。属性有:CustomerName,CompanyName,CustomerInfo.都是string类型。

    public class Customer : XPObject
{
public string CustomerName;
public string CompanyName;

private string customerinfo;
public string CustomerInfo
{
get { return customerinfo; }
set {
string oldValue = CustomerInfo;
if (oldValue == value)
return;
customerinfo = value;
OnChanged("CustomerInfo", oldValue, value);//记录改变

}
}
//....

CustomerName和CompanyName 的定义我们前面已经学过了。现在看看 CustomerInfo属性的定义;在CustomerInfo的值发生改变的时候调用了一个OnChanged()方法;这个方法所做的修改记录会在UnitOfWork.CommitChanges()方法调用的时候把对这个属性做的改变 更新到数据库中。

2.定义数据库。

为了以后在这业务上扩展个web应用,我们创建了一个DAL.这样可以共享 UnitOfWork

在Program类中添加一个静态方法InitDAL(),并在Main()方法中调用。

    static class Program
{
/// <summary>
/// 应用程序的主入口点。
/// </summary>
[STAThread]
static void Main()
{
InitDAL();
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Form1());
}
private static void InitDAL()
{
DevExpress.Xpo.XpoDefault.DataLayer = DevExpress.Xpo.XpoDefault.GetDataLayer(
DevExpress.Xpo.DB.AccessConnectionProvider.GetConnectionString(@"c:\database\customer.mdb"),
DevExpress.Xpo.DB.AutoCreateOption.DatabaseAndSchema);
}
}


3.界面设计:

在这个例子中我们需要两个窗体:一个主窗体用于显示列表。一个模态窗体用于编辑详情。

在主窗体上拖拽一个gridcontrol、XPView和一个Session。

然后把Customer持久类绑定到XPView.ObjectClassInfo属性上;然后点击”Properties“属性,添加三个列,分别用于显示”CustomerName“,"CompanyName","Oid";再把Session1绑定到XPView1的Session属性上。

这里我要说明为什么不用XPCollection而用XPView。XPView从数据库中获取的记录没有创建持久化对象,所以在性能上要比XPCollection要好的多。

4.实现事务:

在gridcontrol的DoubleClick事件处理:

        private void gridControl1_DoubleClick(object sender, EventArgs e)
{
GridHitInfo hit = gridView1.CalcHitInfo(gridControl1.PointToClient(MousePosition)); //判断点击的是不是行,不是就返回
if (!hit.InRow)
return;
//开始事务
using (NestedUnitOfWork nuow = xpView1.Session.BeginNestedUnitOfWork())
{
//获得Customer对象
Customer currentCustomer = nuow.GetNestedObject(xpView1[gridView1.GetDataSourceRowIndex(gridView1.FocusedRowHandle)].GetObject()) as Customer;

using (modalForm mf = new modalForm(currentCustomer))
{
//指定模态对话框的标题
mf.Text = gridView1.GetRowCellDisplayText(gridView1.FocusedRowHandle, gridView1.FocusedColumn);
//如果DialogResult等于OK就提交到数据库中。
if (mf.ShowDialog() == DialogResult.OK)
{
nuow.CommitChanges();
}
}

}
}


在modalForm.CS中的代码:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace Lession4
{
public partial class modalForm : Form
{
private Customer dataSource;
public modalForm(Customer dataSource)
{
InitializeComponent();
this.dataSource = dataSource;


}

private void modalForm_Load(object sender, EventArgs e)
{
memoEdit1.DataBindings.Add("Text", dataSource, "CustomerInfo");

}
}
}

最后,在FormLoad里添加 些演示数据。代码不贴了。 ok,启动调试。

结束语:

 1.在给持久类的属性赋值的时候用OnChanged()方法。用它可以记录改变,这样并没有更新到数据库中。当我们调用NestedUnitOfWork 的CommitChanges()的时候才会更新到数据库。

2.知道了如何创建和使用 DAL

3.知道了XPCollection和XPView的区别。

4.知道了Nested unit of work (怎么翻译比较确切呢?)