form2.cs

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms; namespace DataAdapter
{
public partial class Form2 : Form
{
private DataSet ds = new DataSet(); public Form2()
{
InitializeComponent();
} private void Form2_Load(object sender, EventArgs e)
{
MakeParentTable();
MakeChildTable();
MakeDataRelation();
BindToDataGrid(); } /// <summary>
/// 创建父表
/// </summary>
private void MakeParentTable()
{
//实例化一个表的对象,并命名为ParentTable
DataTable table = new DataTable("ParentTable");
//声明列和行的对象
DataColumn column;
DataRow row; //创建新的列,上面是声明,下面才是实例化
column = new DataColumn();
//列的数据类型
column.DataType = System.Type.GetType("System.Int32");
//列的名称
column.ColumnName = "id";
//列的读写方式--只读
column.ReadOnly = true;
//指定列的内容受唯一限制(内容不能重复)
column.Unique = true;
//将设置好的列对象添加到DataTable中
table.Columns.Add(column); //继续创建列
column = new DataColumn();
column.DataType = System.Type.GetType("System.String");
column.ColumnName = "ParentItem";
//是否自增
column.AutoIncrement = false;
//设置列标题
column.Caption = "ParentItem";
column.ReadOnly = false;
column.Unique = false;
table.Columns.Add(column); ////为表设置主键字段,首先选出要作为主键的字段添加到一个DataColumn集合中
////这也侧面说明DataTable里面也可以有多个主键字段
DataColumn[] PrimaryKeyColumns = new DataColumn[];
PrimaryKeyColumns[] = table.Columns["id"];
table.PrimaryKey = PrimaryKeyColumns; //上面已经把一个表构造弄好了,或者说一张表已经准备好了
//接下来就是实例化DataSet对象
ds.Tables.Add(table); //现在ds中有一张ParentTable表,这长表有两个列,但是还是没有数据行
//下面就来添加三行数据 //行的实例化不能用new DataRow();因为是使用table的构架来实例一个新行
row = table.NewRow();
row["id"] = ;
row["ParentItem"] = "父表的第1行数据";
//添加到表中去
table.Rows.Add(row); row = table.NewRow();
row["id"] = ;
row["ParentItem"] = "父表的第2行数据";
//添加到表中去
table.Rows.Add(row); row = table.NewRow();
row["id"] = ;
row["ParentItem"] = "父表的第3行数据";
//添加到表中去
table.Rows.Add(row); } private void MakeChildTable()
{
//实例化一个表的对象,并命名为ChildTable
DataTable table = new DataTable("ChildTable");
//声明列和行的对象
DataColumn column;
DataRow row; //创建新的列,上面是声明,下面才是实例化
column = new DataColumn();
//列的数据类型
column.DataType = System.Type.GetType("System.Int32");
//列的名称
column.ColumnName = "ChildID";
column.Caption = "ID";
//列的读写方式--只读
column.AutoIncrement = true;
column.ReadOnly = true;
//指定列的内容受唯一限制(内容不能重复)
column.Unique = true;
//将设置好的列对象添加到DataTable中
table.Columns.Add(column); //继续创建列
column = new DataColumn();
column.DataType = System.Type.GetType("System.String");
column.ColumnName = "ChildItem";
//是否自增
column.AutoIncrement = false;
//设置列标题
column.Caption = "ChildItem";
column.ReadOnly = false;
column.Unique = false;
table.Columns.Add(column); //继续创建列
column = new DataColumn();
column.DataType = System.Type.GetType("System.Int32");
column.ColumnName = "ParentID";
//是否自增
column.AutoIncrement = false;
//设置列标题
column.Caption = "ParentID";
column.ReadOnly = false;
column.Unique = false;
table.Columns.Add(column); //上面已经把一个表构造弄好了,或者说一张表已经准备好了
//接下来就是实例化DataSet对象
//ds = new DataSet();
ds.Tables.Add(table); //为表创建15个行数据,注意ParentID列的值,正好对应父表中的三行 for (int j = ; j < ; j++)
{
for (int i = ; i < ; i++)
{
row = table.NewRow();
row["ChildID"] = i+*j;
row["ChildItem"] = "第" + i + "项";
//这是外键行,这个需要参考你的父表中的值,不能错了
row["ParentID"] = j;
table.Rows.Add(row);
}
}
} private void MakeDataRelation()
{
//为上面创建的两张表之间建立关系
//得到父表中要用于关系的列
DataColumn parentColumn = ds.Tables["ParentTable"].Columns["id"];
//得到子表中要用于关系的列
DataColumn childColumn = ds.Tables["ChildTable"].Columns["ParentID"]; //新建关系,括号中的参数分别是(约束名,父表字段,子表字段)
DataRelation relation = new DataRelation("parent2child", parentColumn, childColumn);
//将约束关系添加到子表ChildTable中
ds.Tables["ChildTable"].ParentRelations.Add(relation);
} private void BindToDataGrid()
{
//在界面上放了一个dataGridView控件
dataGridView1.DataSource = ds.Tables["ParentTable"];
dataGridView2.DataSource = ds.Tables["ChildTable"];
} private void dataGridView1_CellClick(object sender, DataGridViewCellEventArgs e)
{
string pid = dataGridView1.CurrentRow.Cells[].Value.ToString();
if (pid != "")
{
DataView dv = ds.Tables["ChildTable"].DefaultView;
//设置搜索条件
dv.RowFilter = "ParentID = " + pid;
//指定数据源
dataGridView2.DataSource = dv; }
}
}
}

C# DataTable和DataRelation的更多相关文章

  1. c# DataTable、DataSet、DataReader

    C# DataTable 详解 dataTable.Rows.Count == 0 //判断DataTable 为空 循环执行dataTable数据 DataTable dtSelect = (Dat ...

  2. 将Json数据转换为ADO.NET DataSet对象

    Json数据转换为ADO.NET DataSet其实方法有很多,Newtonsoft.Json也提供了DataSet的Converter用以转换Json数据.但是有些情况下DataSet Conver ...

  3. .net数据库操作

    刚接触到数据库时总是被数据库中的一些基本概念,比如Connection.Command.DataReader等,给整的糊里糊涂.如今,对数据库的基本操作有了一定的认识,特此做出总结,以便后续工作中查阅 ...

  4. C#与数据库访问技术总结(十六)之 DataSet对象

    DataSet对象 DataSet对象可以用来存储从数据库查询到的数据结果,由于它在获得数据或更新数据后立即与数据库断开,所以程序员能用此高效地访问和操作数据库. 并且,由于DataSet对象具有离线 ...

  5. c#学习笔记04——ADO.NET

    ADO.NET结构:ADO.NET建立在几个核心类之上,这些类可以分为两组 包含和管理数据的类:DataSet DataTable DataRow DataRelation... 链接数据源的类:Co ...

  6. DataSet,DataTable,DataView、DataRelation

    一.创建Dataset和DataTable DataSet ds = new DataSet();//DataSetName默认为"NewDataSet" DataTable ta ...

  7. 用DataRelation给多个DataTable建立关系并显示到TreeView

    DataRelation 对象执行两种功能: 它可使与正使用的记录相关的记录可用.如果在父记录 (GetChildRows) 中,则它提供子记录:如果正使用子记录 (GetParentRow),则它提 ...

  8. C#中DataTable中的Compute方法使用收集

    原文: C#中DataTable中的Compute方法使用收集 Compute函数的参数就两个:Expression,和Filter. Expresstion是计算表达式,关于Expression的详 ...

  9. DataTable.Compute()用法

    DataTable.Compute()用法 2010-04-07 11:28 一.DataTable.Compute()方法說明如下 作用:          计算用来传递筛选条件的当前行上的给定表达 ...

随机推荐

  1. Atitit.软件仪表盘(4)--db数据库子系统-监测

    Atitit.软件仪表盘(4)--db数据库子系统-监测 连接数::: 死锁表列表:死锁基础列表(最近几条记录,时间,sql等) 3.对服务器进行监控,获取CUP,I/O使用情况   4.对数据库进行 ...

  2. Nginx - rewrite 不区分大小写进行匹配

    Nginx - rewrite 不区分大小写进行匹配 分类: Nginx2014-05-28 19:25 1046人阅读 评论(0) 收藏 举报 Use (?i) to match case-inse ...

  3. LINK : fatal error LNK1104

    今天本来想试试opencv的,于是就在自己的机子上部署一下试试,结果一直遇到这个错误:LINK : fatal error LNK1104 环境:win7 64位 vs2012 opencv 2.4. ...

  4. Java Mail(三):Session、Message详解

    http://blog.csdn.net/ghsau/article/details/17909093 ************************************* 本文来自:高爽|Co ...

  5. AndroidStudio添加Android源码

    找了半天没找到,还是用google好啊!修改如下,打开如下的build.gradle,修改compileSdkVersion 为你下载的源码版本号. Open your sdk manager fro ...

  6. 存档格式选择--JSON

    游戏里存档可以直接用lua,但是lua需要有一定编程基础:另外可以用ini,不过ini又太简单了,复杂的 格式无法用ini描述:还可以用xml,它的表达能力非常丰富,甚至有限数据库都用xml来作存储结 ...

  7. 为什么对一些矩阵做PCA得到的矩阵少一行?

    很多时候会出现把一个N*M的矩阵做pca(对M降维)之后却得到一个M*(M-1)矩阵这样的结果.之前都是数学推导得到这个结论,但是, 今天看到一个很形象的解释: Consider what PCA d ...

  8. CI 结合Bootstrap 分页

    #显示列表 public function index(){ //载入分页类 $this->load->library('pagination'); //每页显示的条数 $perPage= ...

  9. MS SQL Server2012中的EOMONTH函数

    MS SQL Server2012中的EOMONTH函数   这个函数是获取一个指定日期所在月份最后一天的日期.可以得到某一个月月份的最后一天 如: declare @orderdate date=' ...

  10. 如果想要跨平台,在file类下有separtor(),返回锁出平台的文件分隔符

    对于命令:File f2=new file(“d:\\abc\\789\\1.txt”) 这个命令不具备跨平台性,因为不同的OS的文件系统很不相同. 如果想要跨平台,在file类下有separtor( ...