Windows窗体控件开发示例:扩展TreeView

摘要:讲述了如何向 TreeView 控件添加数据绑定功能,它是一系列 Microsoft Windows 控件开发示例之一。您可以将本文与相关的概述文章结合起来阅读。

简介

在可能的情况下,您应该先使用些现成的控件;因为提供的 Microsoft Windows 窗体控件中包含大量编码和测试成果,如果您要放弃它们从头开始,无疑是一种巨大的浪费。基于此,在本例中,我将继承一个现有 Windows 窗体控件 TreeView ,然后对其进行自定义。在下载该 TreeView 控件的代码时,您还会得到附加的控件开发示例,以及一个演示如何与其他数据绑定控件一起使用该增强 TreeView 的示例应用程序。

  设计数据绑定树视图

对于 Windows 开发人员来说,向 TreeView 控件添加数据绑定是经常会遇到的问题,但由于 TreeView 和其他控件(如 ListBox 或 DataGrid)存在一个主要差别(即 TreeView 显示分层数据),因而基本控件目前还不支持此功能(也就是说,我们还必须使用它)。给定一个数据表,您就会很清楚如何在 ListBox 或 DataGrid 中显示该信息,但利用 TreeView 的分层特点来显示同样的数据就不那么简单明了。就个人而言,我在使用 TreeView 显示数据时曾应用过许多不同的方法,但有一种方法最常用:按某些字段将表中的数据分组,如图 1 所示。

图 1:在 TreeView 中显示数据

在本例中,我将创建一个 TreeView 控件,在该控件中可传递一个平面数据集(如图 2 所示),并可轻松地生成图 1 所示的结果。

图 2:平面结果集,包含创建图 1 所示的树所需的所有信息

在开始编码之前,我为新控件想出了一个可以处理该特定数据集的设计,并希望它能够适用于许多其他类似的情形。添加一个足可以使用大多数平面数据创建分层结构的组集合,在该集合中为每一级分层均指定一个分组字段、显示字段和值字段(任一或所有字段均应相同)。为了将图 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:分组节点与叶节点

叶节点和分组节点之间的区别(如图 3 所示)对本文的余下部分具有重要意义。我决定将这两类节点区别对待,为每一类节点分别创建自定义节点,并根据所选的节点类型引发不同的事件。

时间: 2024-08-30 17:13:02

Windows窗体控件开发示例:扩展TreeView的相关文章

从在 Internet Explorer 中使用 Windows 窗体控件开始谈Smart Client

client|window|控件 首先引用Microsoft Windows 窗体快速入门教程上的文章"在 Internet Explorer 中使用 Windows 窗体控件":(如果引用的一些信息无法正常显示,请直接上面上的链接查看) 本主题描述如何在 Internet Explorer (IE) 内成功地执行 Windows 窗体控件.IE 内的 Windows 窗体控件无需用户提示即可激活,它不要求注册,而且利用公共语言运行库 (CLR) 代码访问安全性. 在 Internet

在IE浏览器中使用Windows窗体控件(一)

window|控件|浏览器 在IE浏览器中使用Windows窗体控件(一) 作者::Thiru Thangarathinam 翻译:秋枫 引言 在过去,Web程序员经常在他们的Web程序中使用ActiveX控件来实现一些胖客户端才具有的功能.不过现在开发者可以很容易的通过Microsoft.NET Framework来简洁和安全的建立对象,并且方便的在IE浏览器中切入使用.通过在IE浏览器中创建Windows窗体控件,开发者可以实现丰富的web客户端.在这篇文章中,我们将会知道怎样创建Windo

如何:对Windows 窗体控件进行线程安全调用_C#教程

示例 访问 Windows 窗体控件本质上不是线程安全的.如果有两个或多个线程操作某一控件的状态,则可能会迫使该控件进入一种不一致的状态.还可能出现其他与线程相关的 bug,包括争用情况和死锁.确保以线程安全方式访问控件非常重要. .NET Framework 有助于在以非线程安全方式访问控件时检测到这一问题.在调试器中运行应用程序时,如果创建某控件的线程之外的其他线程试图调用该控件,则调试器会引发一个 InvalidOperationException,并提示消息:"从不是创建控件 contr

在IE浏览器中使用Windows窗体控件(二)

window|控件|浏览器 在IE浏览器中使用Windows窗体控件(二) 作者::Thiru Thangarathinam 翻译:秋枫 通过windows窗体控件访问Web Service 窗体控件一个重要优点就是你可以通过它在客户端实现丰富的用户信息.比如说,你可以通过窗体控件对Web服务的访问从而在IE中显示而不需要重新刷新该页面.为了演示这点,我们先来创建一个Web服务,接着再来演示怎样通过窗体控件调用Web服务. 创建Web service 我们创建一个 Visual C# Asp.n

在IE浏览器中使用Windows窗体控件(三)

window|控件|浏览器 在IE浏览器中使用Windows窗体控件(三) 作者::Thiru Thangarathinam 翻译:秋枫 调试Windows窗体控件 要调试窗体控件,你需要按照下面步骤进行. 1.打开浏览器并请求包含窗体控件的那个Html页面. 2.打开visual Studio.Net同时选择工具->调试进程就会显示下面的对话框. 在这个进程对话框中,选择IEXPLORE.EXE 点击附加按钮.当你点击附加按钮时会跳出一个对话框提示你选择要调试的程序类型.我们选择了Common

在WPF工程中如何调用Windows窗体控件项目中控件属性、方法以及事件????

问题描述 运行环境:VS2008使用的工程:WPF应用程序以及Windows窗体控件库使用过程:新建一个Windows窗体控件库项目,这里名字叫MyControl新建一个Form窗体用来承载用户控件,这个Form窗体叫UerControl1,对应的文件名字为:UerControl1.vb在项目中添加对用户控件的必要的引用在项目中添加一个我下载的用户控件,这里名字叫A新建一个WPF工程,这里名字叫WPFProjWindow1.xaml文件的代码如下:<Windowx:Class="Windo

Windows窗体控件如何给WPF窗体中的控件传递信息????????

问题描述 请问大家,我这里有两个工程,一个是WPF窗体工程,一个是Windows窗体控件.然后WPF窗体工程中加载了Windows窗体控件.现在我再在WPF窗体中加入两个TextBox控件,我希望鼠标在Windows窗体控件内移动鼠标的时候,Windows窗体控件的Mouse_Move事件触发,并且该事件中能够编写代码把鼠标当前位置的X,Y坐标分别显示在WPF窗体的TextBox控件内.请问,这如何实现呢? 解决方案 解决方案二:自己顶一下.望大家帮忙.解决方案三:PostMessage解决方案

在C#中,在windows窗体控件中添加了个windows media player 播放器控件,怎样可以选择哪一首旧播放哪一首??

问题描述 在windows窗体中还有个listview控件显示从数据库显示的歌曲名称等信息,在listview控件中显示歌曲列表,并设置了右键快捷播放按钮,怎样可以选择一首歌就播放哪首歌?歌曲从数据库查询得到歌名等信息,添加到listview控件中,在里面显示歌曲列表.然后设置了个右键播放快捷键,选中一首个旧播放它.怎么绑定选择那首歌旧播放哪首歌.privatevoid播放ToolStripMenuItem_Click(objectsender,EventArgse){stringpath=En

windows窗体控件-ckeckedlistbox 控件的集合

问题描述 ckeckedlistbox 控件的集合 我想实现选择该控件的集合元素时只选择其中的一个元素,但是不知道用什么属性 解决方案 C#之常用控件集合(英文版) 解决方案二: http://www.cnblogs.com/colder/archive/2011/05/16/2047871.html