GZFramwork数据库层《三》普通主从表增删改查
运行结果:


使用代码生成器(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
系列文章
4. GZFramwork数据库层《二》单据表增删改查(自动生成单据号码)
6. GZFramwork数据库层《四》单据主从表增删改查(主键自动生成)
7. GZFramwork数据库层《五》高级主从表增删改查(主表明细表主键都自动生成)
8. GZFramwork数据库层《六》存储过程调用
9. GZFramwork数据库层《七》总结
GZFramwork数据库层《三》普通主从表增删改查的更多相关文章
- GZFramwork数据库层《四》单据主从表增删改查
同GZFramwork数据库层<三>普通主从表增删改查 不同之处在于:实例 修改为: 直接上效果: 本系列项目源码下载地址:https://github.com/GarsonZhang/G ...
- GZFramwork数据库层《二》单据表增删改查(自动生成单据号码)
运行效果: 使用代码生成器(GZCodeGenerate)生成tb_EmpLeave的Model 生成器源代码下载地址: https://github.com/GarsonZhang/GZCodeGe ...
- GZFramwork数据库层《一》普通表增删改查
运行结果: 使用代码生成器(GZCodeGenerate)生成tb_MyUser的Model 生成器源代码下载地址: https://github.com/GarsonZhang/GZCode ...
- Django框架(八)--单表增删改查,在Python脚本中调用Django环境
一.数据库连接配置 如果连接的是pycharm默认的Sqlite,不用改动,使用默认配置即可 如果连接mysql,需要在配置文件中的setting中进行配置: 将DATABASES={} 更新为 DA ...
- Django框架(九)—— 单表增删改查,在Python脚本中调用Django环境
目录 单表增删改查,在Python脚本中调用Django环境 一.数据库连接配置 二.orm创建表和字段 三.单表增删改查 1.增加数据 2.删除数据 3.修改数据 4.查询数据 四.在Python脚 ...
- Vc数据库编程基础MySql数据库的表增删改查数据
Vc数据库编程基础MySql数据库的表增删改查数据 一丶表操作命令 1.查看表中所有数据 select * from 表名 2.为表中所有的字段添加数据 insert into 表名( 字段1,字段2 ...
- 【黑马Android】(04)数据库的创建和sql语句增删改查/LinearLayout展示列表数据/ListView的使用和BaseAdater/内容提供者创建
数据库的创建和sql语句增删改查 1. 载入驱动. 2. 连接数据库. 3. 操作数据库. 创建表: create table person( _id integer primary key, nam ...
- 数据库开发基础-SQl Server 控制数据库的服务+数据库的创建与管理(增删改查)
控制数据库的服务: 方法一: 1.Windows+R 打开运行 打开cmd 2.输入net start MSSQLserver 启动数据库服务 输入net stop MSSQLserver 关闭数据 ...
- 数据库开发基础-★SQl Server 控制数据库的服务+数据库的创建与管理(增删改查)★
控制数据库的服务: 方法一: 1.Windows+R 打开运行 打开cmd 2.输入net start MSSQLserver 启动数据库服务 输入net stop MSSQLserver 关闭数据 ...
随机推荐
- IOS第18天(6,CAKeyframeAnimation关键帧动画)
******* #import "HMViewController.h" @interface HMViewController () @property (weak, nonat ...
- document获取节点byTagName
/* *对于页面中的超链接,新闻链接通过新窗口打开 *当然是要获取其中被操作的超链接对象. *可是通过Document获取超链接,拿到的是页面中所有的超链接节点. *只想获取一部分如何办呢? *只要获 ...
- canvas的默认尺寸
canvas一直就是偶尔看看,随便画点小东西,没有认真琢磨过,今天打算认真的从头学一下,画线的时候感觉坐标不太正常,后来发现,canvas有自己的默认尺寸 写法如下 <canvas id=&qu ...
- Codeigniter 3.0 相关文档 part one
分页配置项 http://stackoverflow.com/questions/18418900/codeigniter-pagination-config-without-repeating-wi ...
- 3D Touch
一.认识3D Touch 1.硬件和操作系统要求 iPhone 6s或者iPhone 6s Plus 操作系统要求 ios9+ 2.3D Touch的交互效果 QuickAct ...
- [转]Ubuntu下使用Jni开发例子
http://www.cnblogs.com/zxglive2006/archive/2012/01/15/2323110.html 先用eclipse 创建 Java Project; 然后直接 ...
- df 命令(转)
linux中df命令的功能是用来检查linux服务器的文件系统的磁盘空间占用情况.可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息. 1.命令格式: df [选项] [文件] 2.命 ...
- Line segment matching
FMII2方法:FMII方法的轻微的修改.有限线段和无限线段(直线)的匹配. 求解方法: SVD分解 Unit Quaternion 协方差矩阵: 通过对C进行SVD分解得到R,根据R求得T. 算法流 ...
- Oracle权限和数据类型
oracle创建用户: CREATE USER 用户名 IDENTIFIED BY 口令 [ACCOUNT LOCK|UNLOCK] [注]LOCK|UNLOCK创建用户时是否锁定,默认为锁定状态.锁 ...
- C# 程序中的变量
变量命名规则: 不能是c#关键字 由字母,数字,下划线构成 第一个不能是数字 不要超过31个字符 不能是函数名,类名 c#是大小写敏感的. 本质上,数据类型就是他存储方式和他参与运算的抽象. c#的数 ...