C# DataTable和DataRelation

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的更多相关文章
- c# DataTable、DataSet、DataReader
C# DataTable 详解 dataTable.Rows.Count == 0 //判断DataTable 为空 循环执行dataTable数据 DataTable dtSelect = (Dat ...
- 将Json数据转换为ADO.NET DataSet对象
Json数据转换为ADO.NET DataSet其实方法有很多,Newtonsoft.Json也提供了DataSet的Converter用以转换Json数据.但是有些情况下DataSet Conver ...
- .net数据库操作
刚接触到数据库时总是被数据库中的一些基本概念,比如Connection.Command.DataReader等,给整的糊里糊涂.如今,对数据库的基本操作有了一定的认识,特此做出总结,以便后续工作中查阅 ...
- C#与数据库访问技术总结(十六)之 DataSet对象
DataSet对象 DataSet对象可以用来存储从数据库查询到的数据结果,由于它在获得数据或更新数据后立即与数据库断开,所以程序员能用此高效地访问和操作数据库. 并且,由于DataSet对象具有离线 ...
- c#学习笔记04——ADO.NET
ADO.NET结构:ADO.NET建立在几个核心类之上,这些类可以分为两组 包含和管理数据的类:DataSet DataTable DataRow DataRelation... 链接数据源的类:Co ...
- DataSet,DataTable,DataView、DataRelation
一.创建Dataset和DataTable DataSet ds = new DataSet();//DataSetName默认为"NewDataSet" DataTable ta ...
- 用DataRelation给多个DataTable建立关系并显示到TreeView
DataRelation 对象执行两种功能: 它可使与正使用的记录相关的记录可用.如果在父记录 (GetChildRows) 中,则它提供子记录:如果正使用子记录 (GetParentRow),则它提 ...
- C#中DataTable中的Compute方法使用收集
原文: C#中DataTable中的Compute方法使用收集 Compute函数的参数就两个:Expression,和Filter. Expresstion是计算表达式,关于Expression的详 ...
- DataTable.Compute()用法
DataTable.Compute()用法 2010-04-07 11:28 一.DataTable.Compute()方法說明如下 作用: 计算用来传递筛选条件的当前行上的给定表达 ...
随机推荐
- Activiti工作流简单入门 (zhuan)
https://my.oschina.NET/Barudisshu/blog/309721 *********************************************** 摘要: 自j ...
- python操作word
python教程(百度经验) Python 操作Word(Excel.PPT等通用) import win32comfrom win32com.client import Dispatch, co ...
- C++的历史与现状
在31年前(1979年),一名刚获得博士学位的研究员,为了开发一个软件项目发明了一门新编程语言,该研究员名为Bjarne Stroustrup,该门语言则命名为——C with classes,四年后 ...
- CI 多表关联查询
方法一:$this->db->query("sql 语句"); 直接写sql语句 方法二: #多表关联查询 $data=$this->db->fr ...
- JQueryEasyUI-DataGrid显示数据,条件查询,排序及分页
<html><head> <title></title> <script src="/jquery-easyui-1.3.4 ...
- MapReduce的InputFormat过程的学习
转自:http://blog.csdn.net/androidlushangderen/article/details/41114259 昨天经过几个小时的学习,把MapReduce的第一个阶段的过程 ...
- 关于Unity的坐标系
1.坐标系分为左手坐标系和右手坐标系 2.用手从X轴旋到Y轴画一个弧,如果大拇指所指的方向是Z轴,那么这个坐标系就是这只手的坐标系 3.Unity是左手坐标系,OpenGl是右手坐标系 Unity坐标 ...
- pycharm Tab键设置成4个空格
file--->setting,选择Editor--->python,如下图所示:
- 【NOIP模拟题】行动!行动!(spfa+优化)
spfa不加优化果断tle最后一个点................... 这题和ch的一题很像,只不过这题简单点,这是一个层次图,即有很多个相同的图,这些相同的图之间又存在着练习.. 然后每一次队列 ...
- hdu 2059:龟兔赛跑(动态规划 DP)
龟兔赛跑 Time Limit : 1000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Submissi ...