运行结果:

使用代码生成器(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. 树莓派文档翻译 - 使用 - GPIO: 树莓派A和B

    https://www.raspberrypi.org/documentation/usage/gpio/README.md 2016/6/25 GPIO: 树莓派A和B ##介绍GPIO和在树莓派上 ...

  2. Objective-C 中类属性(修饰)

    Objective-C 中类属性(修饰) (2013-07-13 14:38:35) 转载▼ 标签: it 分类: IOS笔记 nonatomic: 非原子性访问,对属性赋值的时候不加锁,多线程并发访 ...

  3. BFC以及文档流

    在一个文档流中,盒子模型元素的位置会互相影响. 当一个BFC出现在文档流中时,BFC内部的盒子模型元素同BFC外部的元素之间的位置不会互相影响. 相当于BFC重新创建了一个文档流. 举例: 一个文档流 ...

  4. ubuntu 安装 nodejs

    http://blog.csdn.net/caib1109/article/details/51804687 我的系统环境: Ubuntu 16.04 64位 本文内容亲测可用, 请放心食用 使用淘宝 ...

  5. WPF部署问题 解决:The application requires that the assembly...be installed in the GAC

    vs-->引用-->找到问题类库-->邮件属性--->特定版本-->false done

  6. 服务设计模式一:Web服务概述

    目录 1. Web服务是什么 2.为什么要使用Web服务 3.Web服务考虑的因素和替代方案 4.SOA是什么 Web服务是什么? 所谓服务,通俗的理解就是别人帮你做一些事情,比如说,腰酸背痛了,找个 ...

  7. LeetCode Generalized Abbreviation

    原题链接在这里:https://leetcode.com/problems/generalized-abbreviation/ 题目: Write a function to generate the ...

  8. App软件开发的完整在线流程(一看就懂)

    App软件开发其实并不复杂,完整的在线App开发不过9个步骤,一看就明白到底是怎么回事. 第一步:需求评估 在App项目正式启动前,客户应该对自己的需求进行评估,确认项目的开发周期和成本.登录APIC ...

  9. ROW_NUMBER

    16:23 2015/4/16 删除重复数据,连续被两位同事问到完全相同的重复记录如何删除只保留一条 create table del_samerecords (id )) go insert int ...

  10. Tomcat8启动报there was insufficient free space available after evicting expired cache entries - consider increasing the maximum size of the cache

    09-Dec-2016 10:57:49.150 WARNING [localhost-startStop-1] org.apache.catalina.webresources.Cache.getR ...