DataRelation 对象执行两种功能:

它可使与正使用的记录相关的记录可用。如果在父记录 (GetChildRows) 中,则它提供子记录;如果正使用子记录 (GetParentRow),则它提供父记录。

它可强制约束的引用完整性,如删除父记录时删除相关的子记录。

了解真正的联接与 DataRelation 对象功能之间的差异很重要。在真正的联接中,从父表和子表获取记录并将其放入单个的平面记录集。当使用 DataRelation 对象时,不创建新记录集。而关系跟踪表之间的关系并使父记录和子记录保持同步。

public partial class DataRelationDemo : System.Web.UI.Page
{
    private SqlConnection conn;
    private SqlDataAdapter dad;
    private DataSet ds;
    protected void Page_Load(object sender, EventArgs e)
    {
        //连接数据库pubs,且把三张表填充到DataSet里;
        this.conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["pubsConnectionString"].ToString());
        this.dad = new SqlDataAdapter("select job_id,job_desc from jobs select pub_id,pub_name from publishers select pub_id,job_id,fname,lname from employee", conn);
        this.ds=new DataSet();
        this.dad.Fill(ds);
        //给三张表建立不同的关系;
        //通过job_id给employee和jobs建立主外间关系;注意主表(父表)在前,从表(子表)在后,注意参数的顺序
        DataRelation relationjob = new DataRelation("empjob", ds.Tables[0].Columns["job_id"], ds.Tables[2].Columns["job_id"]);
        //添加到DataSet里的Relations中;
        ds.Relations.Add(relationjob);
        //通过pub_id给employee和publishers建立主外间关系;注意主表(父表)在前,从表(子表)在后,注意参数的顺序
        DataRelation relationpub = new DataRelation("emppub", ds.Tables[1].Columns["pub_id"], ds.Tables[2].Columns["pub_id"]);
        //添加到DataSet里的Relations中;
        ds.Relations.Add(relationpub);
        //循环遍力主表(父表),
        foreach (DataRow drpub in ds.Tables[1].Rows) {
            //建立父节点
            TreeNode nodepart = new TreeNode();
            nodepart.Text = drpub["pub_name"].ToString();
            this.TreeView1.Nodes.Add(nodepart);//将父节点添加到树控件;
            //在循环遍力主表所对应的从表(子表),用GetChildRows(relationpub)得到的是一个DataRow数组;
            foreach (DataRow dremp in drpub.GetChildRows(relationpub)) {
                //在建立子节点;
                TreeNode nodechild = new TreeNode();
                nodechild.Text = dremp["fname"].ToString() + " " + dremp["lname"].ToString();
                nodepart.ChildNodes.Add(nodechild);//将子节点添加到父节点里;
                //通过dremp.GetParentRow(relationjob)这个方法得到从表(子表)所对应的主表(父表),而返回的是一行DataRow数据;
                //因此不需要用循环遍历;
               DataRow dr=dremp.GetParentRow(relationjob);
               ////在建立子节点;
               TreeNode nodechch = new TreeNode();
               nodechch.Text = dr["job_desc"].ToString();
               nodechild.ChildNodes.Add(nodechch);//将子节点添加到上以及子节点里;
            }
        }
    }
}

用DataRelation给多个DataTable建立关系并显示到TreeView的更多相关文章

  1. datatable绑定comboBox显示数据[C#]

    实现功能: datatable绑定comboBox,在下拉菜单中显示对应数据 实现方法: 1.生成datatable,并为combox绑定数据源: comboBox1.DataSource = dt1 ...

  2. jquery datatable ajax配置详解

    我写的这个东西类似于个人笔记,如果你想要完整的而了解 可以去这里看看 http://dt.thxopen.com/ 包括英文原网站都不错. 通过配置ajax的属性和服务器交互 $("sele ...

  3. jquery datatable测试部分代码(仅自用)

    创建一个四列的datatable表,第四列为表格里的按钮设置,respond为JSON对象数组. $('#example').DataTable({        //每页显示十条数据        ...

  4. datatable修改每页默认显示的数量

    datatable修改每页默认显示的数量 一.总结 一句话总结: iDisplayLength属性:'iDisplayLength':50 1.datatable默认每页显示50个? iDisplay ...

  5. ADO.NET编程之美----数据访问方式(面向连接与面向无连接)

    最近,在学习ADO.NET时,其中提到了数据访问方式:面向连接与面向无连接.于是,百度了一下,发现并没有很好的资料,然而,在学校图书馆中发现一本好书(<ASP.NET MVC5 网站开发之美&g ...

  6. 022. ASP.NET为DataSet中数据集添加关系及动态创建主子表和添加主子表关系

    protected void Page_Load(object sender, EventArgs e) { string connectionString = "server=.;data ...

  7. ADO.NET - 全面梳理

    转自:http://www.cnblogs.com/yangcaogui/archive/2012/06/09/2537086.html 目录: 简单的介绍下ADO.NET SqlConnection ...

  8. 简述ADO.NET命名空间

    system.data命名空间的类型 system.data命名空间的核心成员 命名空间 作用 Constraint  表示某个DataColumn对象的约束 DataColumn 表示某个DataT ...

  9. ADO.NET梳理

    目录: 简单的介绍下ADO.NET SqlConnection(连接对象) SqlCommand(命令对象) SqlParameter(Sql参数) SqlDataReader(数据流读取器) Sql ...

随机推荐

  1. c#结构体、打他table、excel、csv互转

    1.csv相关 public static class CsvHelper { /// <summary> /// 根据csv路径获取datatable /// </summary& ...

  2. NoSuchBeanDefinitionException: No qualifying bean of type 'org.springframework.web.servlet.view.InternalResourceViewResolver' available

    问题描述: 项目中需要配置多个视图解析器,所以使用ContentNegotiatingViewResolver来处理,在其内部设置了FreeMarkerViewResolver .InternalRe ...

  3. salesforce零基础学习(八十六)Ajax Toolkit (VF页面中使用及javascript action使用)

    Ajax Toolkit 参考文档:https://resources.docs.salesforce.com/212/latest/en-us/sfdc/pdf/apex_ajax.pdf 在项目中 ...

  4. ant基础[转]

    原文链接:http://www.cnblogs.com/wufengxyz/archive/2011/11/24/2261797.html 1,什么是antant是构建工具2,什么是构建概念到处可查到 ...

  5. JDBC学习笔记(三)

    获取数据库的元信息metadata,里面有数据库特性的描述信息,如是否支持事务,是否支持批处理等. Connection conn = DriverManager.getConnection(url, ...

  6. 洛谷 [P1113] 杂务

    图论的做法是topsort 一看见有序我们就想到了DAG图,于是用topsort做,对于每一个加入队列的顶点,都用它的时间去更新它所指向的点的时间,本质上仍是DP的思想,dp[i]=max{dp[j] ...

  7. BZOJ 3295: [Cqoi2011]动态逆序对 [CDQ分治]

    RT 传送门 首先可以看成倒着插入,求逆序对数 每个数分配时间(注意每个数都要一个时间)$t$,$x$位置,$y$数值 $CDQ(l,r)$时归并排序$x$ 然后用$[l,mid]$的加入更新$[mi ...

  8. 线性一致性与全序广播------《Designing Data-Intensive Applications》读书笔记12

    上一篇聊了聊构建分布式系统所面临的困难,这篇将着重讨论构建容错分布式系统的算法与协议.构建容错系统的最佳方法是使用通用抽象,允许应用程序忽略分布式系统中的一些问题.本篇我们先聊一聊线性一致性,以及与线 ...

  9. 一个很好的MySQL在线学习平台

    一个很好的MySQL在线学习平台 https://www.techonthenet.com/sql/

  10. XAMPP简介、安转、使用

    虽然没有写Mac安装方法及使用, 但方法也都大相径庭, 殊途同归而已. XAMPP简介 XAMPP是一款开源.免费的网络服务器软件,经过简单安装后,就可以在个人电脑上搭建服务器环境.本文为大家介绍Wi ...