C# DataTable和DataRelation
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[1]; PrimaryKeyColumns[0] = table.Columns["id"]; table.PrimaryKey = PrimaryKeyColumns; //上面已经把一个表构造弄好了,或者说一张表已经准备好了 //接下来就是实例化DataSet对象 ds.Tables.Add(table); //现在ds中有一张ParentTable表,这长表有两个列,但是还是没有数据行 //下面就来添加三行数据 //行的实例化不能用new DataRow();因为是使用table的构架来实例一个新行 row = table.NewRow(); row["id"] = 1; row["ParentItem"] = "父表的第1行数据"; //添加到表中去 table.Rows.Add(row); row = table.NewRow(); row["id"] = 2; row["ParentItem"] = "父表的第2行数据"; //添加到表中去 table.Rows.Add(row); row = table.NewRow(); row["id"] = 3; 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 = 1; j < 4; j++) { for (int i = 0; i < 5; i++) { row = table.NewRow(); row["ChildID"] = i+5*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[0].Value.ToString(); if (pid != "") { DataView dv = ds.Tables["ChildTable"].DefaultView; //设置搜索条件 dv.RowFilter = "ParentID = " + pid; //指定数据源 dataGridView2.DataSource = dv; } } } }