如何把树与数据库的信息进行绑定

数据结构 : 树的分类及在数据库索引中的运用 树 数据库索引 b树 b+树 阅读详情

以前写了一个例子,演示如何通过数据库数据动态加载TreeNode,参看:

Http://blog.youkuaiyun.com/knight94/archive/2006/03/24/637699.aspx

 

可能原先的例子,只是显示如何动态加载一个树,没有考虑到后期的修改或删除之类的操作,因此我在原有基础上,扩展了更新操作。不过实现的基础,还是在程序中保存一个临时数据表,要注意的是,如果数据量比较大的话,考虑到效率以及资源使用等因素,则可以取消临时数据表,而直接去访问数据库即可,这可以根据实际应用来修改我的方法。

 

以下就具体说说实现的步骤。

首先,是创建临时数据表。

    private DataTable dtTree = null;

    private void CreateTable()

    {

        // Create data table

        dtTree = new DataTable( "TreeDBInfo" );

 

        // Add new data columns

        DataColumn dc = new DataColumn( "EmployeeID", typeof(int) );

        dtTree.Columns.Add( dc );

        // Set primary key column

        dtTree.PrimaryKey = new DataColumn[]{dc};

 

        dtTree.Columns.Add( new DataColumn( "EmployeeName", typeof(string) ) );

        dtTree.Columns.Add( new DataColumn( "Age", typeof(int) ) );

        dtTree.Columns.Add( new DataColumn( "Salary", typeof(double) ) );

        dtTree.Columns.Add( new DataColumn( "Address", typeof(string) ) );

        dtTree.Columns.Add( new DataColumn( "EmpParentID", typeof(int) ) );

 

        // Add records into table

        //'0' is that the type has no parent

        dtTree.Rows.Add( new object[]{1, "Parent1",30, 2000,"***", 0} );

        dtTree.Rows.Add( new object[]{2, "Parent2",30, 2000,"***", 0} );

        dtTree.Rows.Add( new object[]{3, "Parent3",32, 2000,"***", 0} );

 

        dtTree.Rows.Add( new object[]{4, "Child1",25, 1400,"***", 1} );

        dtTree.Rows.Add( new object[]{5, "Child2",27, 1600,"***", 1} );

        dtTree.Rows.Add( new object[]{6, "Child3",27, 1600,"***", 2} );

 

        dtTree.Rows.Add( new object[]{7, "GrandChild1",23, 1200,"***", 4} );

        dtTree.Rows.Add( new object[]{8, "GrandChild2",23, 1200,"***", 4} );

        dtTree.Rows.Add( new object[]{9, "GrandChild3",22, 1200,"***", 5} );

    }

 

接着就是通过数据表来加载TreeNode。

    private void CreateTree()

    {

        DataRow[] drArray = dtTree.Select( "EmpParentID=0",

                            "EmpParentID ASC",

                            DataViewRowState.CurrentRows );

        if( drArray.Length == 0 ) return;

 

        TreeNode tnNew = null;

        foreach( DataRow dr in drArray )

        {

            tnNew = trvDBBinding.Nodes.Add( dr["EmployeeName"].ToString() );

            tnNew.Tag = dr["EmployeeID"].ToString();//Save "EmployeeID" in node's tag

            CreateTreeNode( ref tnNew );

        }

    }

 

    private void CreateTreeNode( ref TreeNode tnParent )

    {

        //Get children data info

        DataRow[] drArray = dtTree.Select(

            string.Format( "EmpParentID = {0}", tnParent.Tag ),

            "EmpParentID ASC",

            DataViewRowState.CurrentRows );

        if( drArray.Length == 0 ) return;

 

        TreeNode tnNew = null;

        foreach( DataRow dr in drArray )

        {

            tnNew = tnParent.Nodes.Add( dr["EmployeeName"].ToString() );

            tnNew.Tag = dr["EmployeeID"].ToString();//Save "EmployeeID" in node's tag

            CreateTreeNode( ref tnNew );

        }

    }

 

这里需要注意的是,要保存每条记录的主键到每个TreeNode的Tag属性中,即使动态从数据库查询也是一样的,这样能唯一标明记录,从而快速定位。

 

为了方便操作,我用弹出对话框的方法来查看或者修改TreeNode信息,那么对话框的代码大致如下:

    private DataTable dtTree = null;

    private TreeNode tnSelected = null;

 

    // frmViewNode constructor

    public frmViewNode( ref DataTable TreeTable, ref TreeNode SelectedNode )

    {

        //

        // Required for Windows Form Designer support

        //

        InitializeComponent();

 

        //

        // TODO: Add any constructor code after InitializeComponent call

        //

 

        dtTree = TreeTable;

        tnSelected = SelectedNode;

    }

 

    private void ShowNodeInfo()

    {

        // Find node info from data table

        DataRow[] drArray = dtTree.Select(

            string.Format( "EmployeeID = {0}", tnSelected.Tag ),

            "EmployeeID ASC",

            DataViewRowState.CurrentRows );

        if( drArray.Length == 0 ) return;

        else if( drArray.Length == 1 )

        {

            // Show tree node info

            txtName.Text = drArray[0]["EmployeeName"].ToString();

            txtAge.Text = drArray[0]["Age"].ToString();

            txtSalary.Text = drArray[0]["Salary"].ToString();

            txtAddress.Text = drArray[0]["Address"].ToString();

        }

    }

 

    private void frmViewNode_Load(object sender, System.EventArgs e)

    {

        ShowNodeInfo();

    }

 

    private void btnOK_Click(object sender, System.EventArgs e)

    {

        // Find node info from data table

        DataRow[] drArray = dtTree.Select(

            string.Format( "EmployeeID = {0}", tnSelected.Tag ),

            "EmployeeID ASC",

            DataViewRowState.CurrentRows );

        if( drArray.Length == 0 ) return;

        else if( drArray.Length == 1 )

        {

            // Update data to data table

            drArray[0].BeginEdit();

            drArray[0]["EmployeeName"] = txtName.Text;

            drArray[0]["Age"] = txtAge.Text;

            drArray[0]["Salary"] = txtSalary.Text;

            drArray[0]["Address"] = txtAddress.Text;

            drArray[0].EndEdit();

        }

 

        // Update tree node

        tnSelected.Text = txtName.Text;

        this.DialogResult = DialogResult.OK;

    }

 

则在显示TreeView的窗体中弹出以上窗体的代码如下:

    private TreeNode tnSelected = null;

    private void trvDBBinding_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)

    {

        if( e.Button == MouseButtons.Left )

        {

            tnSelected = trvDBBinding.GetNodeAt( e.X, e.Y );

        }

    }

 

    private void trvDBBinding_DoubleClick(object sender, System.EventArgs e)

    {

        if( tnSelected != null )

        {

            //Open window to view treenode info

            frmViewNode myViewNode = new frmViewNode( ref dtTree, ref tnSelected );

            if( myViewNode.ShowDialog() == DialogResult.OK )

            {

                //Update database using "dtTree"

 

                dtTree.AcceptChanges();//Update datatable

            }

        }

    }

 

    private void trvDBBinding_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)

    {

        tnSelected = e.Node;

    }

 

要注意的是,如何去更新数据库,是在“DoubleClick”事件中去做还是在弹出窗体中去做。我个人推荐在弹出的窗体中去更新,因为效率比较高,不管是通过临时数据表还是动态从数据库进行加载。

 

如果使用临时数据表的话,因为在更新DataTable的时候,已经定位到具体记录了,那么只要用DataAdapter去执行Update方法即可(别忘了给DataAdapter设定UpdateCommand,否则数据库什么都不会更新);如果使用动态数据表的话,只需要设置相应的DBCommand,来进行更新操作即可。

浅析数据库(DB)、操作数据存储(ODS)和数据仓库(DW)的区别与联系 文章背景:相信大部分刚接触上面三个概念的同学,都多多少少会有些迷惑,现在我就给大家简单分析下这三者的关系,希望大家对这三者的概念理解有所帮助吧。本文主要从下面两类关系来叙述上面三者的关系: 数据库(DB)和数据仓库(DW)的区别与联系 操作数据存储(ODS)和数据仓库(DW)的区别与联系 数据库与数据仓库的区别与联系数据库与数据仓库基础概念:数据库:传统的关系型数据库的主要应用,主要是基本的、日常的 阅读详情

相关推荐

python连接db2的官方库ibm_db的api

IBM_DBAPI 文档摘要 该文档详细介绍了 IBM_DBAPI 的核心功能和使用方法。主要内容包括: 连接管理:提供 connect/pconnect 建立连接,active 检查状态,close 关闭连接,以及错误处理函数 conn_error/conn_errormsg。 事务控制:包含 commit/rollback 事务操作,以及 autocommit 自动提交设置。 SQL执行:支持 exec_immediate 直接执行,prepare 预处理,execute 执行语句,execute_ma

cd0_0的博客 1928

C# treeview 与 SQL 数据库联动

首先,我因为什么要写这个文章呢,是这样的,我早些的时候就用过这个东西,这个东西那个时候对我来说一个很有逻辑的事情,还挺有意思,当时,我用了好几天也没有整明白这个逻辑,怎么做也做不出来,后来我的某一个老师给了我一个源码,我就直接用了,当时,我也没仔细看,时隔两年,突然要用,我就想我自己突破一下自己,看看自己能不能整明白,事实证明:这玩意还挺简单,真不知道当时是哪里难住我了。 话不多说,先看数据库里存储的样子: 这个代码是通过treeView 存入到 SQL中的树状图数据 这个就是从C# 存入到数据库的树状图

weixin_43303279的博客 1893

treeview动态添加节点内容 立刻保存至数据库

treeview控件 与数据库连接 添加 修改 删除节点 可以动态保存到数据库,下次打开程序可以显示上次修改后的结果

C# TreeView与DataTable交互添加节点两种方式

本文转载:http://dengzebo.blog.163.com/blog/static/18867406201032141742168/ 方式一: #region "读取树结点从Datatable" /// <summary> /// 读取树结点从Datatable" /// </summary> ...

CVSTO的博客 980

C#将数据库的数据邦定到TreeView中

将数据库中的数据绑定到TreeView中

C# WinForm 控件TreeView 最简单的连接数据库实例函数

C# WinForm 控件TreeView 最简单的连接数据库实例函数 入口: Fun_Tree(TreeView TREE, DataTable DT)//DataTable格式(编号,目录名,上级目录编号) 里面用的DataTable是内存建的 dt.Columns.Add("编号"); dt.Columns.Add("目录名"); dt.Columns.Add("上级目录编号"); dt.Rows.Add("1", "目录一", "0"); dt.Rows.Add("2", "目录二", "1"); dt.Rows.Add("3", "目录三", "0"); dt.Rows.Add("4", "目录四", "2");

关于数据库中数据结构TREE大概介绍

根 内部结点:有子结点的结点 叶子结点:没有子结点的结点 为了优化查询,mysql提出了索引的概念 1.索引的概念 当用户创建索引的时候,mysql首先复制数据,完成一个新的数据结构(Btree平衡树),mysql索引默认用的时候B+tree结构 平衡树:左右两树的结点的高度相差不能超过1(0 -1 1) 2.B+tree (1)必须有根节点 根节点为空或者只有一个记录...

前路艰险,路途漫长 817

tree(数据库动态生成)

连接数据库动态读取,可以对节点增加,修改,删除,ajax页面无刷新json传值详情细看

[转载]如何把树与数据库的信息进行绑定

如何把树与数据库的信息进行绑定如何把树与数据库的信息进行绑定 以前写了一个例子,演示如何通过数据库数据动态加载TreeNode,参看:Http://blog.youkuaiyun.com/knight94/archive/200...

congji3817的博客 73

使用treeview和listview显示数据库的数据

使用treeview和listview显示数据库的数据

Tree(将数据库记录生成树)

通过java代码将数据库里的记录生成xml字符串 思路:递归实现

C# TreeView树视图控件 如何把树与数据库的信息进行绑定

可能原先的例子,只是显示如何动态加载一个树,没有考虑到后期的修改或删除之类的操作,因此我在原有基础上,扩展了更新操作。不过实现的基础,还是在程序中保存一个临时数据表,要注意的是,如果数据量比较大的话,考虑到效率以及资源使用等因素,则可以取消临时数据表,而直接去访问数据库即可,这可以根据实际应用来修改我的方法。   以下就具体说说实现的步骤。 首先,是创建临时数据表。     private...

weixin_34342992的博客 226

别再手动写JSON了!用Node-RED OPC UA节点5分钟搞定楼宇温湿度数据采集

本文介绍了如何利用Node-RED和OPC UA节点快速实现楼宇温湿度数据的自动化采集与JSON格式转换。通过可视化工具Node-RED,开发者无需编写复杂代码,5分钟内即可完成从传感器到数据输出的全流程配置,大幅提升智慧楼宇和工业物联网项目的实施效率。

weixin_30368405的博客 432

数据库DB与数据仓库DW区别和联系

数据库(DB)和数据仓库(DW)的区别与联系 数据库与数据仓库基础概念: 数据库:传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。 数据仓库:数据仓库系统的主要应用主要是OLAP(On-Line Analytical Processing),支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。 OLTP和OLAP概念补充: 数据处理大致可以分成两大类:联机事务处理OLTP(on-line transaction processing)、联机分析处理OLAP(On-Line

信竞星球_少儿编程题库 2471

RT-Thread 5.1.0 实战:手把手教你用CubeMX和RT-Studio创建第一个工程(附常见编译错误修复)

本文详细介绍了如何使用STM32CubeMX和RT-Thread Studio 5.1.0创建第一个RT-Thread工程,包括开发环境准备、CubeMX配置、工程整合及常见编译错误修复。通过实战指南,帮助开发者快速上手RT-Thread 5.1.0,解决开发过程中的典型问题,提升嵌入式开发效率。

weixin_29165465的博客 285

【TCAX相关】Python 官方手册下载页面(中文+英文)

Python 官方手册下载页面(中文+英文) 中文: https://docs.python.org/zh-cn/3.8/archives/ https://docs.python.org/zh-cn/3.6/archives/ 英文: https://www.python.org/doc/versions/ https://docs.python.org/3/archives/ https://www.python.org/ftp/python/doc/ ...

Seekladoom的博客 1012

摸鱼不如来了解一下--数据库DB与数据仓库DW区别和联系

数据库(DB)和数据仓库(DW)的区别与联系 数据库与数据仓库基础概念: 数据库:传统的关系型数据库的主要应用,主要是基本的、日常的事务处理,例如银行交易。 数据仓库:数据仓库系统的主要应用主要是OLAP(On-Line Analytical Processing),支持复杂的分析操作,侧重决策支持,并且提供直观易懂的查询结果。 OLTP和OLAP概念补充: 数据处理大致可以分成两大类:...

信竞星球_少儿编程题库 313

SAP BTP-Cloud foundry 构建并部署JAVA应用程序

本文为 SAP BTP Java 应用程序的简单实例, 我们可以用此实例来熟悉SAP BTP 中的java应用开开发流程.在你完成改示例java应用程序以后, 我们可以直接使用该java应用程序进行后续的开发流程, 或直接构建一个新的JAVA应用程序来支持新的业务开发。

seyafly的博客 803

【2021-1-5】QT+SQLsever数据库的数据管理系统

QT+SQLsever数据库的数据管理系统目录登录界面统计图表制作QT界面之间传递参数左键点击tablevie后跳出菜单点击表格在label上显示图片、下载、上传到数据库保存widget为PDF保存tableview为Excellineedit美化,combo box 美化作者有话说 目录 该系统的功能有:图表显示,图像界面对数据的增删改查,界面跳转缓冲进度条,开机界面,角色管理等。 登录界面 数据库连接: /********************************数据库连接**********

每晚秃头的程序员的博客 3872

深入SVT SPI VIP配置:如何灵活控制CS间隔、数据帧大小与时钟频率(含代码片段)

本文深入探讨了SVT SPI VIP的高级配置技巧,包括精确控制CS信号间隔、突破数据帧大小限制以及动态时钟频率切换。通过实战代码片段和详细配置步骤,帮助验证工程师灵活应对复杂SPI协议验证场景,提升验证效率和覆盖率。特别适合需要处理非标准SPI时序和特殊数据帧的芯片验证项目。

weixin_27014595的博客 280

高频注入是否需要对齐和强拖操作?

高频注入技术显著优化了传统FOC启动流程,但仍需部分对齐操作。传统启动必须包含位置检测、对齐和强拖等步骤,而高频注入可实现零速闭环,简化或跳过部分环节。高频注入下的对齐主要用于验证有效性、初始化观测器和建立初始磁链,形式可大幅简化。虽然高频注入基本消除了传统强拖需求,但在重载、弱凸极等特殊情况下仍需辅助。实际应用中可采用自适应混合策略,根据负载和电机类型选择最优启动方案。高频注入使对齐和强拖从"必须"变为"可选优化项",是无传感器控制的重要进步。

汽车软件开发 204
上一篇: 浅谈如何使用ADO.NET操作数据库
下一篇: 如何用一个数据库的数据去更新另一个数据库的内容
Knight94
博客等级 码龄25年 1013粉丝 87原创
评论 20
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值