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 关闭数据 ...
随机推荐
- [基础常识]阿里云ecs从购买到环境搭建和建站!!(phpstudy一件包)
首先如何购买ECS?发现有些人购买5G硬盘,我个人认为买硬盘应该购买20以上!这样以后好处理! 进入http://www.aliyun.com/product/ecs/?spm=5176.7189 ...
- JS开发windows phone8.1系列之2
http://msdn.microsoft.com/zh-cn/library/windows/apps/dn629636.aspx Windows.Storage.ApplicationData.r ...
- AIM Tech Round 3 (Div. 2) A B C D
虽然打的时候是深夜但是状态比较好 但还是犯了好多错误..加分场愣是打成了降分场 ABC都比较水 一会敲完去看D 很快的就想出了求0和1个数的办法 然后一直wa在第四组..快结束的时候B因为低级错误被h ...
- Given a compiled machine-language program, which statements in the source language cause the execution of the most machine-language instructions and what is the execution time of these instr
COMPUTER ORGANIZATION AND ARCHITECTURE DESIGNING FOR PERFORMANCE NINTH EDITION A variety of studi ...
- [LeetCode]题解(python):116 Populating Next Right Pointers in Each Node
题目来源 https://leetcode.com/problems/populating-next-right-pointers-in-each-node/ Given a binary tree ...
- 百度地图API-自定义图标覆盖物
地图覆盖物 Overlay:覆盖物的抽象基类,所有的覆盖物均继承此类的方法. Marker:标注表示地图上的点,可自定义标注的图标. Label:表示地图上的文本标注,您可以自定义标注的文本内容. P ...
- HTML5实现下载文件且指定下载文件名
<a href="/files/adlafjlxjewfasd89asd8f.pdf" download="预算表.pdf">下载</a> ...
- Python开发【第五章】:Python常用模块
一.模块介绍: 1.模块定义 用来从逻辑上组织python代码(变量,函数,类,逻辑:实现一个功能),本质上就是.py结尾python文件 分类:内置模块.开源模块.自定义模块 2.导入模块 本质:导 ...
- Timer的用法
目的实现一个间隔轮询执行的功能. 从网上看到java中可以使用Timer,于是本篇文件就对自己的使用记录,进行一次记录. 主函数: package cn.test.timer; import java ...
- linux下用户账户切换
1,)当前我已经登录一个用户hadoop,我怎么切换到root账户呢(应为一般用户经常会遇到无权限修改/etc/hosts./ect/hostname等文件的权限)? 使用命令sudo su root ...