C# DataTable和DataRelation

1

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;

            }
        }
    }
}
posted on 2013-11-14 14:18  神秘藏宝室  阅读(2576)  评论(0编辑  收藏  举报

 >>>转载请注明出处<<<