zoukankan      html  css  js  c++  java
  • XPO学习(4)一个WINFROM的数据编辑应用程序

    在这一节, 我们将学会应用 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 (怎么翻译比较确切呢?)





  • 相关阅读:
    Linux从入门到进阶全集——【第十四集:Shell编程】
    cmake 编译 c++ dll 的一个例子
    %1 不是有效的Win32应用程序
    C++ 生成 dll 和调用 dll 的方法实例(转)
    Clion cmake 一个简单的 C++ 程序
    一月4
    一月4日
    1月4日
    一月4日
    一月4日
  • 原文地址:https://www.cnblogs.com/OOAbooke/p/2216297.html
Copyright © 2011-2022 走看看