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()方法說明如下 作用: 计算用来传递筛选条件的当前行上的给定表达 ...
随机推荐
- 让低版本IE也能正常运行HTML5+CSS3网站的3种解决方案
现在我们可以选择浏览器非常多,所以浏览器的环境也是种类繁多,同一个浏览器也是包含各种不同的版本,不同的版本之间的渲染方法也存在差异,,它们支持的 HTML5.CSS3 特性恐怕也不尽相同.这种情况于是 ...
- element UI 的学习一,路由跳转
1.项目开始: # 安装vue $ cnpm install vue@2.1.6 # 全局安装 vue-cli $ cnpm install --global vue-cli ...
- Secure REST API with oauth2 (翻译)
http://blog.csdn.net/haiyan_qi/article/details/52384734 ******************************************** ...
- python学习笔记(9)--Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法
Python UnicodeEncodeError: 'gbk' codec can't encode character 解决方法 这篇文章主要介绍了Python UnicodeEncodeErro ...
- Android基础总结(十一)Fragment,动画
Fragment(重要) 用途:在一个Activity里切换界面,切换界面时只切换Fragment里面的内容 生命周期方法跟Activity一致,可以理解把其为就是一个Activity fragmen ...
- Entity Framework(七):Fluent API配置案例
一.配置主键 要显式将某个属性设置为主键,可使用 HasKey 方法.在以下示例中,使用了 HasKey 方法对 Product 类型配置 ProductId 主键. 1.新加Product类 usi ...
- OSX监听全局键盘按下事件并捕获事件源的硬件接口位置
在OSX系统全局监听键盘的按下事件,并可以捕获事件源的硬件的接口位置,用于区分是哪个键盘产生的事件.下面的代码只是以键盘为例子,其实是可以适用于其他输入外设的.如有需要可搜索相关外设的匹配字典的创建代 ...
- php之道
PHP The Right Way. Tweet 欢迎 目前网络上充斥着大量的过时资讯,让 PHP 新手误入歧途,并且传播着错误的实践以及不安全的代码.PHP 之道 收集了现有的 PHP 最佳实践.编 ...
- UEFI + win8 + ubuntu16.04双系统安装
主要参考 https://linux.cn/article-3178-1.html https://linux.cn/article-3061-1.html 其他 https://jingyan.ba ...
- 第二百五十节,Bootstrap项目实战--响应式导航
Bootstrap项目实战--响应式导航 学习要点: 1.响应式导航 一.响应式导航 基本导航组件+响应式 第一步,声明导航区域,设置导航默认样式,设置导航条固定在顶部navbar样式class类,写 ...