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. [svc]后台运行程序screen or nohup

    后台运行 方法1 & 方法2:screen screen –S lnmp à起个名字 进去后运行程序 Ctrl+ad à退出lnmp屏幕 Scree –ls à查看 Screen –r xxx ...

  2. commit

    git blame -L  260, 270  a.xml no permissions fastbootsudo chown root:root fastbootsudo chmod +s fast ...

  3. TIME_WAIT详解

    1.TCP四次挥手关闭链接过程 2.TIME_WAIT的产生条件主动关闭方在发送四次挥手的最后一个ACK会变为TIME_WAIT状态,保留此状态的时间为两个MSL 3.TIME_WAIT两个MSL的作 ...

  4. vue中config/index.js:配置的详细理解

    当我们需要和后台分离部署的时候,必须配置config/index.js: 用vue-cli 自动构建的目录里面  (环境变量及其基本变量的配置) var path = require('path') ...

  5. FreeRtos——移植

    现在准备的简单程序LED灯的工程目录中增加freertos文件夹: 在 source目录下的portable目录下只留下下面的文件夹: 为什么呢? 把对应文件移植在工程中之后,添加头文件路径如下图: ...

  6. mysql学习笔记2--mysql的基本使用

    4. 运行和关闭MySQL服务器 首先检查MySQL服务器正在运行与否.在资源管理器查看有没有mysqld的进程,如果MySQL正在运行,那么会看到列出来的 mysqld 进程.如果服务器没有运行,那 ...

  7. oracle初始操作

    oracle登录 sqlplus  sys/oracle as sysdba 这个登录之后呢 会出现这个: Connected to an idle instance. 这一步是连接上 [oracle ...

  8. Android——RelativeLayout(相对布局)

    一.相对于父容器 1.居中 2.同方向 <?xml version="1.0" encoding="utf-8"?> <RelativeLay ...

  9. RabbitMQ之HelloWorld【译】

    简介 RabbitMQ是一个消息代理,主要的想法很简单:它接收并转发消息.你可以把它当做一个邮局,当你发送邮件到邮筒,你相信邮差先生最终会将邮件投递给收件人.RabbitMQ在这个比喻里,是一个邮筒, ...

  10. PHP之PHP文件引用详解

    HP的文件引用涉及到四个函数: 文件引用 1.include()2.include_once()3.require()4.require_once() 这四个函数常常会给PHP初学者造成困扰,总的来说 ...