运行结果:
使用代码生成器(GZCodeGenerate)生成tb_Cusomer和tb_CusomerDetail的Model
生成器源代码下载地址:
https://github.com/GarsonZhang/GZCodeGenerate/
生成方式见第一节:
GZFramwork数据库层《一》普通表增删改查
生成明细表ORM略有不同:
项目附加结果:
新增一个自定义控件:ucTableMD
界面:
后台代码:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GZFramworkDB.Model;
using GZFramworkDB.BLL;
namespace GZFramworkDB.Main.MyControls
{
public partial class ucTableMD : UserControl, IData
{
public bllBusiness bll;
protected DataTable dtMain;
protected DataTable dtDetail;
FormStatus Status;
public ucTableMD()
{
InitializeComponent();
Status = FormStatus.View;
bll = new bllBusiness(typeof(tb_Customer), typeof(tb_CustomerDetail));
gv_Summary.FocusedRowChanged += gv_Summary_FocusedRowChanged;
this.gv_Detail.InitNewRow += new DevExpress.XtraGrid.Views.Grid.InitNewRowEventHandler(this.gv_Detail_InitNewRow);
}
void gv_Summary_FocusedRowChanged(object sender, DevExpress.XtraGrid.Views.Base.FocusedRowChangedEventArgs e)
{
if (gv_Summary.FocusedRowHandle < 0)
{
gc_Detail.DataSource = null;
return;
}
string Key = gv_Summary.GetFocusedDataRow()[bll.RelationKey].ToString();
if (Status == FormStatus.Add)
{
dtDetail.DefaultView.RowFilter = String.Format("{0}='{1}'", tb_CustomerDetail.CustomerCode, Key);
gc_Detail.DataSource = dtDetail;
}
else
{
DataSet ds = bll.GetDetailData(Key);
gc_Detail.DataSource = ds.Tables[0].Copy();
}
}
//明细表新增行的时候
private void gv_Detail_InitNewRow(object sender, DevExpress.XtraGrid.Views.Grid.InitNewRowEventArgs e)
{
string CustomerCode = gv_Summary.GetFocusedRowCellValue(tb_Customer.CustomerCode).ToString();
gv_Detail.SetRowCellValue(e.RowHandle, tb_Customer.CustomerCode, CustomerCode);
}
public void DoSearch()
{
gc_Summary.DataSource = null;
gc_Detail.DataSource = null;
if (dtMain != null)
dtMain.Rows.Clear();
if (dtDetail != null)
dtDetail.Rows.Clear();
dtMain = bll.GetSummaryData();
dtDetail = bll.GetDetailData("").Tables[0];
gc_Summary.DataSource = dtMain;
gc_Detail.DataSource = dtDetail;
Status = FormStatus.View;
}
public void DoAdd()
{
gc_Summary.DataSource = null;
gc_Detail.DataSource = null;
if (Status == FormStatus.View)
{
if (dtMain != null)
dtMain.Rows.Clear();
if (dtDetail != null)
dtDetail.Rows.Clear();
Status = FormStatus.Add;
}
dtMain.Rows.Add();
gc_Summary.DataSource = dtMain;
gc_Detail.DataSource = dtDetail;
}
public void DoDeleteKey()
{
string Key = gv_Summary.GetFocusedDataRow()[bll.SummaryKey].ToString();
bll.Delete(Key);
foreach (DataRow dr in dtDetail.Select(String.Format("{0}='{1}'", tb_CustomerDetail.CustomerCode, Key)))
{
dr.Delete();
}
gv_Summary.DeleteSelectedRows();
dtDetail.AcceptChanges();
dtMain.AcceptChanges();
}
public void DoDeleteTable()
{
string Key = gv_Summary.GetFocusedDataRow()[bll.SummaryKey].ToString();
foreach (DataRow dr in dtDetail.Select(String.Format("{0}='{1}'", tb_CustomerDetail.CustomerCode, Key)))
{
dr.Delete();
}
gv_Summary.DeleteSelectedRows();
}
public void DoUpdate()
{
DataSet ds = new DataSet();
ds.Tables.Add(dtMain.Copy());
ds.Tables.Add(dtDetail.Copy());
if (bll.Update(ds))
{
MessageBox.Show("更新成功!");
return;
}
ds.Tables.Clear();
dtDetail.AcceptChanges();
dtMain.AcceptChanges();
Status = FormStatus.View;
}
}
public enum FormStatus
{
Add,
View
}
}
和前面一样修改Main.cs
运行结果:
本系列项目源码下载地址:https://github.com/GarsonZhang/GZFramworkDBDemo/
生成器源码下载地址:https://github.com/GarsonZhang/GZCodeGenerate/
系列文章
4. GZFramwork数据库层《二》单据表增删改查(自动生成单据号码)
6. GZFramwork数据库层《四》单据主从表增删改查(主键自动生成)
7. GZFramwork数据库层《五》高级主从表增删改查(主表明细表主键都自动生成)
8. GZFramwork数据库层《六》存储过程调用
9. GZFramwork数据库层《七》总结