没有找到合适的产品?
联系客服协助选型:023-68661681
提供3000多款全球软件/控件产品
针对软件研发的各个阶段提供专业培训与技术咨询
根据客户需求提供定制化的软件开发服务
全球知名设计软件,显著提升设计质量
打造以经营为中心,实现生产过程透明化管理
帮助企业合理产能分配,提高资源利用率
快速打造数字化生产线,实现全流程追溯
生产过程精准追溯,满足企业合规要求
以六西格玛为理论基础,实现产品质量全数字化管理
通过大屏电子看板,实现车间透明化管理
对设备进行全生命周期管理,提高设备综合利用率
实现设备数据的实时采集与监控
利用数字化技术提升油气勘探的效率和成功率
钻井计划优化、实时监控和风险评估
提供业务洞察与决策支持实现数据驱动决策
翻译|其它|编辑:郝浩|2005-03-14 10:49:00.000|阅读 1231 次
概述:
# 界面/图表报表/文档/IDE等千款热门软控件火热销售中 >>
摘要:讲述了如何向 TreeView 控件添加数据绑定功能,它是一系列
Microsoft Windows 控件开发示例之一。您可以将本文与相关的概述文章结合起来阅读。
您可以从 MSDN Code Center 下载 WinFormControls.exe(英文)源代码。(请注意,在示例文件中,程序员的注释使用的是英文,本文中将其译为中文是为了便于读者理解。)
本文是介绍如何在 Microsoft® .NET 中开发控件的系列文章中的第四篇(共五篇):
目录
简介
在可能的情况下,您应该先使用些现成的控件;因为提供的 Microsoft® Windows®
窗体控件中包含大量编码和测试成果,如果您要放弃它们从头开始,无疑是一种巨大的浪费。基于此,在本例中,我将继承一个现有 Windows 窗体控件 TreeView
,然后对其进行自定义。在下载该 TreeView 控件的代码时,您还会得到附加的控件开发示例,以及一个演示如何与其他数据绑定控件一起使用该增强 TreeView
的示例应用程序。
设计数据绑定树视图
对于 Windows 开发人员来说,向 TreeView 控件添加数据绑定是经常会遇到的问题,但由于 TreeView 和其他控件(如 ListBox 或
DataGrid)存在一个主要差别(即 TreeView
显示分层数据),因而基本控件目前还不支持此功能(也就是说,我们还必须使用它)。给定一个数据表,您就会很清楚如何在 ListBox 或 DataGrid
中显示该信息,但利用 TreeView 的分层特点来显示同样的数据就不那么简单明了。就个人而言,我在使用 TreeView
显示数据时曾应用过许多不同的方法,但有一种方法最常用:按某些字段将表中的数据分组,
在本例中,我将创建一个 TreeView 控件,在该控件中可传递一个平面数据集(
在开始编码之前,我为新控件想出了一个可以处理该特定数据集的设计,并希望它能够适用于许多其他类似的情形。添加一个足可以使用大多数平面数据创建分层结构的组集合,在该集合中为每一级分层均指定一个分组字段、显示字段和值字段(任一或所有字段均应相同)。为了将图
2 所示的数据转变成图 1 所示的 TreeView,我的新控件要求您定义两个分组级别 Publisher 和 Title,并将 pub_id 定义为
Publisher 组的分组字段,将 title_id 定义为 Title
组的分组字段。除分组字段以外,还需要为每个组指定显示和值字段,以确定在相应组节点上显示的文本以及用来唯一标识特定组的值。当遇到此类数据时,请使用
pub_name/pub_id 和 title/title_id
作为这两个组的显示/值字段。作者信息将变成树的叶节点(分组分层结构末端的节点),您还需要为这些节点指定 ID (au_id) 和显示 (au_lname)
字段。
构建自定义控件时,在开始编码之前确定程序员对该控件的使用方法将有助于提高控件的使用效率。这种情况下,我希望程序员(在给定了前面所示的数据和所需结果的情况下)能够使用如下几行代码完成分组:
With DbTreeControl .ValueMember = "au_id" .DisplayMember = "au_lname" .DataSource = myDataTable.DefaultView .AddGroup("Publisher", "pub_id", "pub_name", "pub_id") .AddGroup("Title", "title_id", "title", "title_id") End With |
注意:这并不是我最终编写的代码行,但两者相差不多。在开发控件的过程中,我意识到需要将与 TreeView 关联的 ImageList
中的图像索引与每个分组级别相关联,因此必须向 AddGroup 方法中额外添加一个参数。
为了真正构建该树,我将浏览数据并查找字段(指定为每个分组的分组值)的更改,同时在必要时创建新分组节点,并针对每个数据项创建一个叶节点。由于存在分组节点,因此总节点数将大于数据源中的项目数,但基础数据中的每个项有且仅有一个叶节点。
叶节点和分组节点之间的区别(如图 3
所示)对本文的余下部分具有重要意义。我决定将这两类节点区别对待,为每一类节点分别创建自定义节点,并根据所选的节点类型引发不同的事件。
实现数据绑定
为该控件编写代码的第一步是创建项目和相应的起始类。在本例中,我首先创建一个新 Windows 控件库,然后删除默认的 UserControl 类,并用一个从
TreeView 控件继承的新类来代替它:
Public Class dbTreeControl
Inherits System.Windows.Forms.TreeView
从这时起,我将设计一个可以放入到窗体中的控件,并使其具有常规的 TreeView 的外观和功能。下一步是开始添加旨在处理在 TreeView
中加入的新功能所需的代码,即数据绑定和分组数据。
添加 DataSource 属性
我的新控件的所有功能都很重要,但构建复杂数据绑定控件的两个关键问题是处理 DataSource 属性和从数据源的每个对象中检索单个项目。
创建属性例程
首先,任何用于实现复杂数据绑定的控件都需要实现一个 DataSource 属性例程,并保持适当的成员变量:
Private m_DataSource As Object <Category("Data")> _ Public Property DataSource() As Object Get Return m_DataSource End Get Set(ByVal Value As Object) If Value Is Nothing Then cm = Nothing GroupingChanged() Else If Not (TypeOf Value Is IList Or _ TypeOf Value Is IListSource) Then ' 不是针对该用途的有效数据源 Throw New System.Exception("无效 DataSource") Else If TypeOf Value Is IListSource Then Dim myListSource As IListSource myListSource = CType(Value, IListSource) If myListSource.ContainsListCollection = True Then Throw New System.Exception("无效 DataSource") Else ' 对,对。它是有效的数据源 m_DataSource = Value cm = CType(Me.BindingContext(Value), _ CurrencyManager) GroupingChanged() End If Else m_DataSource = Value cm = CType(Me.BindingContext(Value), _ CurrencyManager) GroupingChanged() End If End If End If End Set End Property |
IList 接口
可用作复杂数据绑定数据源的对象通常都支持 IList Interface(英文),该接口将数据公开为对象集合,并提供若干有用属性,如 Count。我的新
TreeView 控件要求在其绑定中使用一个支持 IList 的对象,但使用另一个接口 IListSource
Interface(英文)也可以,因为它提供了一个获取 IList 对象的简便方法 (GetList)。当设置 DataSource
属性后,我首先确定是否提供了有效的对象,即一个支持 IList 或 IListSource 的对象。我真正想要的是 IList,因此如果对象仅支持
IListSource(例如 DataTable),那么我将使用该接口的 GetList() 方法获得正确的对象。
某些实现 IListSource 的对象(如 DataSet)实际上包含多个由 ContainsListCollection 属性表示的列表。如果该属性为
True,则 GetList 将返回一个表示列表(包含多个列表)的 IList 对象。在我的示例中,我决定支持直接连接到 IList 对象或仅包含一个
IList 对象的 IListSource 对象,并忽略需要附加工作来指定数据源的对象,如 DataSet。
注意:如果要支持此类对象(DataSet 或与之类似的对象),您可以再添加一个属性(如 DataMember)来指定用于绑定的特定子列表。
如果提供的数据源有效,则最终结果是创建 CurrencyManager Class(英文)的实例 (cm = Me.BindingContext(Value))。由于该实例将用于访问基础数据源、对象属性和位置信息,因此被存储在局部变量中。
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com
面对“数字中国”建设和中国制造2025战略实施的机遇期,中车信息公司紧跟时代的步伐,以“集约化、专业化、标准化、精益化、一体化、平台化”为工作目标,大力推进信息服务、工业软件等核心产品及业务的发展。在慧都3D解决方案的实施下,清软英泰建成了多模型来源的综合轻量化显示平台、实现文件不失真的百倍压缩比、针对模型中的大模型文件,在展示平台上进行流畅展示,提升工作效率,优化了使用体验。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
本站的模型资源均免费下载,登录后即可下载。模型仅供学习交流,勿做商业用途。
服务电话
重庆/ 023-68661681
华东/ 13452821722
华南/ 18100878085
华北/ 17347785263
客户支持
技术支持咨询服务
服务热线:400-700-1020
邮箱:sales@evget.com
关注我们
地址 : 重庆市九龙坡区火炬大道69号6幢
慧都科技 版权所有 Copyright 2003-
2025 渝ICP备12000582号-13 渝公网安备
50010702500608号