• 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;
    
                }
            }
        }
    }
  • 相关阅读:
    Ubuntu 16.04
    每天一道LeetCode--389. Find the Difference
    每天一道LeetCode--371. Sum of Two Integers
    Ubuntu 16.04 小飞机启动失败
    每天一道LeetCode--344. Reverse String
    leetcode1458 Max Dot Product of Two Subsequences
    CF1313C2 Skyscrapers (hard version)
    CF1295C Obtain The String
    CF1251D Salary Changing
    CF1286A Garland
  • 原文地址:https://www.cnblogs.com/Mysterious/p/3423232.html
Copyright © 2020-2023  润新知