运行结果:

使用代码生成器(GZCodeGenerate)生成tb_Cusomer和tb_CusomerDetail的Model

生成方式见第一节:

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 < )
{
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[].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[]; 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/GZFramework.Demo

系列文章

1. GZFramwork数据库层《前言》Demo简介

2. GZFramwork数据库层《前言》DLL项目引用

3. GZFramwork数据库层《一》普通表增删改查

4. GZFramwork数据库层《二》单据表增删改查(自动生成单据号码)

5. GZFramwork数据库层《三》普通主从表增删改查

6. GZFramwork数据库层《四》单据主从表增删改查(主键自动生成)

7. GZFramwork数据库层《五》高级主从表增删改查(主表明细表主键都自动生成)

8. GZFramwork数据库层《六》存储过程调用

9. GZFramwork数据库层《七》总结

GZFramwork数据库层《三》普通主从表增删改查的更多相关文章

  1. GZFramwork数据库层《四》单据主从表增删改查

    同GZFramwork数据库层<三>普通主从表增删改查 不同之处在于:实例 修改为: 直接上效果: 本系列项目源码下载地址:https://github.com/GarsonZhang/G ...

  2. GZFramwork数据库层《二》单据表增删改查(自动生成单据号码)

    运行效果: 使用代码生成器(GZCodeGenerate)生成tb_EmpLeave的Model 生成器源代码下载地址: https://github.com/GarsonZhang/GZCodeGe ...

  3. GZFramwork数据库层《一》普通表增删改查

    运行结果:     使用代码生成器(GZCodeGenerate)生成tb_MyUser的Model 生成器源代码下载地址: https://github.com/GarsonZhang/GZCode ...

  4. Django框架(八)--单表增删改查,在Python脚本中调用Django环境

    一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的setting中进行配置: 将DATABASES={} 更新为 DA ...

  5. Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境

    目录 单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 二.orm创建表和字段 三.单表增删改查 1.增加数据 2.删除数据 3.修改数据 4.查询数据 四.在Python脚 ...

  6. Vc数据库编程基础MySql数据库的表增删改查数据

    Vc数据库编程基础MySql数据库的表增删改查数据 一丶表操作命令 1.查看表中所有数据 select * from 表名 2.为表中所有的字段添加数据 insert into 表名( 字段1,字段2 ...

  7. 【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建

    数据库的创建和sql语句增删改查 1. 载入驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, nam ...

  8. 数据库开发基础-SQl Server 控制数据库的服务+数据库的创建与管理(增删改查)

    控制数据库的服务: 方法一: 1.Windows+R 打开运行  打开cmd 2.输入net start MSSQLserver 启动数据库服务 输入net stop MSSQLserver 关闭数据 ...

  9. 数据库开发基础-★SQl Server 控制数据库的服务+数据库的创建与管理(增删改查)★

    控制数据库的服务: 方法一: 1.Windows+R 打开运行  打开cmd 2.输入net start MSSQLserver 启动数据库服务 输入net stop MSSQLserver 关闭数据 ...

随机推荐

  1. 【iCore3 双核心板_FPGA】实验十七:基于I2C总线的ARM与FPGA通信实验

    实验指导书及代码包下载: http://pan.baidu.com/s/1dFqddMp iCore3 购买链接: https://item.taobao.com/item.htm?id=524229 ...

  2. 点击某个按钮弹出 photoswip

    var openPhotoSwipe = function() { var pswpElement = document.querySelectorAll('.pswp')[0]; // build ...

  3. Js表单Submit问题

    一般在submit前,会用js查核是否满足提交标准,如下: function doSubmit(){ if(doucument.getElementbyId("myID") ==& ...

  4. 10/12 study

    [患者版]加号选择页: 这是四个TableView放在Scrollview上 上面是个xib封装的view 整体就是个scrollView,用xib摆上去的控件:   上面加了黄条,旧的控件统一修改y ...

  5. iOS仿网易新闻栏目拖动重排添加删除效果

    仿网易新闻栏目选择页面的基本效果,今天抽了点时间教大家如何实现UICollectionView拖动的效果! 其实实现起来并不复杂,这里只是基本的功能,没有实现细节上的修改,连UI都是丑丑的样子,随手画 ...

  6. 《Linux内核分析》第二周 操作系统是如何工作的?

    [刘蔚然 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000] WEEK TWO(2 ...

  7. 安装LNMP之后出现 Access denied.解决方法

    权限问题, 执行 sudo chown -R www:www /home/wwwroot

  8. 前台 JSON对象转换成字符串 相互转换 的几种方式

    在最近的工作中,使用到JSON进行数据的传递,特别是从前端传递到后台,前台可以直接采用ajax的data函数,按json格式传递,后台Request即可,但有的时候,需要传递多个参数,后台使用requ ...

  9. 《转》Spring4 Freemarker框架搭建学习

    这里原帖地址:http://www.cnblogs.com/porcoGT/p/4537064.html 完整配置springmvc4,最终视图选择的是html,非静态文件. 最近自己配置spring ...

  10. sql server 中删除表中数据truncate和delete的区别(转载自.net学习网)

    我们都知道truncate table可以用来删除整个表的内容,它与delete后面不跟where条件的效果是一样.但除此之外,我们还清楚它们之间有其它的区别吗?本章我们将一起讨论truncate与d ...