程序设计风格、几个控件、递归在TreeView中的使用
- 格式:docx
- 大小:59.01 KB
- 文档页数:6
一、UE4中的TreeView树形结构概述UE4是一款功能强大的游戏开发工具,拥有丰富的功能和组件,其中就包括了TreeView树形结构。
TreeView是一种常见的用户界面控件,可以用于展示层级关系的数据,比如文件夹结构、菜单树等。
在UE4中,使用TreeView可以实现复杂的层级菜单、属性面板等功能,为游戏开发提供了便利。
二、创建TreeView树形结构1. 在UE4中,首先需要创建一个新的UserWidget,作为TreeView的父容器。
在编辑器中选择“User Interface” -> “Widget Blueprint”,创建一个新的UserWidget,并命名为TreeWidget。
2. 在TreeWidget中添加一个TreeView控件,可以在左侧的“Palette”中找到TreeView,并将其拖拽到TreeWidget的CanvasPanel中。
3. 接下来,我们需要在TreeView中添加树形结构的数据。
在TreeWidget的蓝图中创建一个函数,用于绑定数据到TreeView上。
我们可以创建一个名为BindData的函数,然后在该函数中使用AddChild和AddRoot函数向TreeView中添加节点数据。
4. 通过调用TreeView的SetItemHeight函数,可以设置每个节点的高度,使得TreeView显示更加美观。
还可以通过SetIndentation函数设置节点的缩进距离,以体现层级关系。
三、处理TreeView树形结构的交互1. 在UE4中,TreeView是支持交互操作的,比如鼠标点击、拖拽等。
通过监听TreeView的事件,我们可以实现节点的展开、折叠、选中等操作。
2. 在TreeWidget的蓝图中,可以通过绑定TreeView的事件回调函数来处理交互操作,比如OnItemClicked、OnItemDoubleClicked 等。
在这些回调函数中,可以编写逻辑代码来处理节点的展开、折叠等操作。
VFP TreeView控件使用详解vfptreeview控件使用详解vfptreeview控件使用详解(2)这个控件的使用率也就是很高的,所以我们就必须好好掌控一下了。
在梅子这儿存有一个treeview控件的“畅享系列”。
较好!我也就是把她里面的一些精华封盖下来,给大家太少作表明而已。
如果你想要系统的学一下呢,就之下一个“畅享系列”吧!简单的介绍:treeview控件用以显示信息的分级视图,如同windows里的资源管理器的目录。
treeview控件中的各项信息都存有一个与之有关的node对象。
treeview表明node对象的分层目录结构,每个node对象均由一个label对象和其有关的图形共同组成。
在创建treeview控件后,我们可以进行和卷曲、表明或暗藏其中的节点。
treeview控件通常用以显示文件和目录结构、文档中的类层次、索引中的层次和其他具备分层目录结构的信息。
treeview控件有3个属性页,general页、font页、picture页。
treeview控件属性1。
linestyle属性该属性设置本项控件中node对象之间表明的线条类型。
格式:表单.treeview名.linestyle=值值的范围:0-tvwtreelines(缺省)三线显示兄弟节点和父子节点之间的连线1-tvwrootlines根(root)线。
除了上述的连线以外,还表明根目录之间的连线需要注意的是:在设置该属性前,必须设置style属性为treeline(三线)。
2。
style属性该属性返回和设置表现在treeview控件对象中node对象的图形类型和文本类型。
格式:表单.treeview名.style=值值的范围:0-tvwtextonly文本1-tvwpicturetext图象和文本2-tvwplusminustext+/-以及文本3-tvwpluspicturetext+/-、图象以及文本4-tvwtreelinestext连线和文本5-tvwtreelinespicturetext连线、图象和文本6-tvwtreelinesplusminuetext连线、+/-和文本7-tvwtreelinesplusminuspicturetext(缺省)连线、+/-、图象和文本3。
一、什么是treegridview?treegridview 是一种常用的控件,它是基于 gridview 和 treeview 的组合,可以实现树形结构和表格数据的显示,可以展示出树形结构并具有表格的数据功能。
treegridview 是一种常用的控件,用法灵活,功能强大,可以满足各种复杂的数据展示需求。
二、treegridview 的基本用法1. 控件的引用首先需要引用 treegridview 控件,在项目中添加对 treegridview 的引用,引用方式一般是通过将相关的 DLL 文件添加到项目中,然后在项目的代码文件中添加对 treegridview 控件命名空间的引用。
2. 控件的初始化treegridview 控件的初始化工作一般包括设置控件的基本属性、绑定数据源和设置事件处理程序等。
需要注意的是,treegridview 控件的初始化工作一般是在页面加载事件中完成的,以确保在页面首次加载时能够正确显示数据。
3. 数据绑定treegridview 控件的数据绑定工作一般是通过设置控件的数据源来实现的。
在数据绑定过程中,需要注意确保数据源的结构能够正确地映射到树形结构和表格数据的显示需求。
4. 自定义样式treegridview 控件的样式可以通过设置控件的样式属性来实现。
控件的样式设置一般包括设置表头样式、行样式和单元格样式等。
通过自定义样式,可以使 treegridview 控件在页面中展示出符合项目需求的外观效果。
5. 事件处理treegridview 控件的事件处理工作一般包括设置控件的事件处理程序,并在事件处理程序中编写相应的逻辑代码。
在事件处理过程中,需要注意确保事件处理程序能够正确地响应用户操作,并能够对控件的数据进行相应的处理。
6. 控件的功能扩展treegridview 控件的功能还可以通过扩展控件的自定义列、自定义模板和自定义编辑等功能来实现。
通过扩展控件的功能,可以为项目定制出更符合实际需求的数据展示和操作界面。
一、介绍Qt是一款跨评台的C++应用程序开发框架,拥有丰富的UI控件库,可以帮助开发者快速构建各种桌面应用程序。
其中,Qt的QTreeView控件是用来显示树形结构数据的控件,通常用于显示文件系统、目录结构、数据分类等。
在本文中,将介绍Qt中QTreeView控件的高级用法,包括自定义数据模型、自定义视图以及树节点的操作等内容。
二、自定义数据模型1. 继承QAbstractItemModel在Qt中,通过继承QAbstractItemModel类可以实现自定义的数据模型。
我们可以根据自己的数据结构和需求来实现自己的数据模型,包括数据的组织方式、展示方式以及数据的增删改查等操作。
2. 实现必要的虚函数在自定义数据模型中,需要实现一些必要的虚函数,包括rowCount()、columnCount()、data()、index()等函数,用来告诉QTreeView控件如何获取数据、显示数据以及处理用户操作等。
3. 使用自定义数据模型创建自定义数据模型后,可以通过setModel()函数将数据模型应用到QTreeView控件中,从而实现树形结构的显示和操作。
三、自定义视图1. 继承QTreeView除了自定义数据模型,Qt还允许开发者自定义QTreeView控件的视图样式。
通过继承QTreeView类并重写相关的绘制函数,可以实现自定义的视图效果,包括节点的样式、展开/折叠的图标以及节点的编辑等功能。
2. 实现p本人ntEvent()函数在自定义QTreeView的视图样式时,通常需要重写p本人ntEvent()函数,以实现节点的自定义绘制效果。
开发者可以根据自己的需求和设计,绘制不同样式的节点、连接线以及展开/折叠的图标等。
3. 使用自定义视图创建自定义的QTreeView视图后,可以通过setView()函数将自定义的视图应用到QTreeView控件中,从而实现不同的视觉效果和交互体验。
四、树节点的操作1. 增加、删除节点在使用QTreeView控件时,通常需要实现对树节点的增加、删除操作。
treeview用法Treeview一种用于展示数据层次的可视化控件,它通常被用来展示文件夹的内容、文件树状结构、网站的导航结构等。
它可以使用鼠标点击来展开和收起,它的数据通常以树的形式呈现,它可以使用来递归展示数据,以及实现展开和收起的效果。
Treeview使用步骤是:1. 入 Treeview件首先,我们需要在项目中引入 Treeview件,一般来讲,我们可以使用 JavaScript、jQuery、bootstrap相关库来引入 Treeview。
2. 建数据源在使用 Treeview件之前,我们需要准备一份用于展示的文件树状结构的数据。
常见的数据源有 JavaScript数组、JSON式的数据格式等。
3. 始化 Treeview件接着,我们将 Treeview件初始化,通常我们需要指定数据源,以及一些属性,比如支持展开收起等。
4. 建 Treeview 事件当我们在使用 Treeview件的时候,可以创建一些事件,比如点击事件等,这样我们就可以在点击 Treeview件的任意节点时做出相应的反应。
总的来说,Treeview 为我们提供了一种实现文件树状结构展示的可视化控件。
它可以为我们呈现出简洁清晰的数据层次结构,它可以帮助我们更方便地使用它来构建文件层次结构。
Treeview 也可以用于其他更多的场景,比如用于网站的导航设计。
简单的设计可以让用户快速地找到所需的内容,而复杂的设计则可以实现对访问量的控制,帮助用户快速地找到有用的内容。
另外,通过 Treeview件,我们可以让用户看到更直观、更清晰的网站结构,从而使用户可以更加顺利地浏览网站。
另外,Treeview件还可以用于实现较大数据量的展示。
针对于较大的数据量,我们可以利用 Treeview层级展示,实现较大数据量的展示,同时又保留了数据的层次结构,使用户可以更加顺利地浏览数据。
Treeview一种使用极为广泛的可视化控件,它可以用于文件树状结构的展示、网站的导航设计、较大数据量的展示等,它的使用与实现相比较简单,使用它来可视化展示数据是一种更加有效的方式。
⽤户控件-TreeView的⽤法Treeview中ontreenodepopulate是⼀个很好的事件,当你点击树的某个节点时调⼊数据库展现此节点下的数据,并且⽆刷新,当树展现的数据多的时候就可以⽤此⽅法如MSDN的树,但如果数据不多的时候没有必要⽤此⽅法,因为要频繁调数据库好闲话少说由于是⽤户控件所以把 treeview的部分属性和事件公共,⽅便⽤此控件的页⾯调⽤页⾯ TreeDept.ascx<%@ Control Language="C#" AutoEventWireup="true" CodeFile="TreeDept.ascx.cs" Inherits="UserControls_TreeDept" %><asp:TreeView ID="TreeView1" runat="server" ExpandDepth="1" ImageSet="Contacts"NodeIndent="10" onselectednodechanged="TreeView1_SelectedNodeChanged"ontreenodepopulate="TreeView1_TreeNodePopulate" Width="101px"><ParentNodeStyle Font-Bold="True" ForeColor="#5555DD" /><HoverNodeStyle Font-Underline="False" /><SelectedNodeStyle Font-Underline="True" HorizontalPadding="0px"VerticalPadding="0px" /><NodeStyle Font-Names="Verdana" Font-Size="8pt" ForeColor="Black"HorizontalPadding="5px" NodeSpacing="0px" VerticalPadding="0px" /></asp:TreeView>TreeDept.ascx.CSpublic partial class UserControls_TreeDept : erControl{public event EventHandler DeptSel;public string DeptSelectNodeText{get { return TreeView1.SelectedNode.Text; }}SqlConnection con = new SqlConnection(@"server=LT-C9A4FDA64461;uid=sa;pwd=sa;database=ltweb");protected void Page_Load(object sender, EventArgs e){if (!IsPostBack){BindTree();}}void BindTree(){TreeNode tn = new TreeNode();tn.Text = "软件";tn.Value = "1";tn.PopulateOnDemand = true;TreeView1.Nodes.Add(tn);}protected void TreeView1_TreeNodePopulate(object sender, TreeNodeEventArgs e){SqlCommand cmd = new SqlCommand("select * from dept where parentID="+int.Parse(e.Node.Value),con);SqlDataAdapter sda = new SqlDataAdapter(cmd);DataTable dt = new DataTable();sda.Fill(dt);foreach (DataRow dr in dt.Rows){TreeNode tn = new TreeNode(dr["Dept_Name"].ToString(), dr["Dept_ID"].ToString());tn.PopulateOnDemand = true;e.Node.ChildNodes.Add(tn);}}protected void TreeView1_SelectedNodeChanged(object sender, EventArgs e){if(DeptSel!=null)DeptSel(this,EventArgs.Empty);}}调⽤页⾯<form id="form1" runat="server"><div><uc1:TreeDept ID="TreeDept1" runat="server" OnDeptSel="DeptSel_Change"/> </div></form>后台public partial class Dept : System.Web.UI.Page{protected void Page_Load(object sender, EventArgs e){}protected void DeptSel_Change(object sender, EventArgs e){Response.Write(TreeDept1.DeptSelectNodeText);}}。
Winform开发常⽤控件之TreeView菜单导航和权限⽤法TreeView⼀个很棒的控件,我们在做WEB开发时常常犯困的⼀个东东。
当然这⾥介绍winform⾥⾯的⽤法唠。
先介绍⼏个属性吧,CheckBoxes设置为true的话树形节点前⾯会出现checkbox勾选框、ImageList绑定树形⾥⾯的图标(界⾯上放⼀个Imgelist控件,绑定上即可)、ShowLines(树形展开时显⽰线条)等等哦,这个⽅法好,this.MenutreeView.ExpandAll();即Treeview加载后全部展开。
下⾯先介绍⼀个简单的菜单⽤法1、TreeView节点的设置和选取节点TreeView静态节点的设置⽅法很简单,主要⽤在软件的快捷导航中。
贴图,可以设置多级节点,每个节点设置Name和Text属性即可,如果觉得不美观,可以放⼀些图标。
本例中的图标是⽤ImageList绑定到⾥⾯的,还是⽐较简单。
设置好节点后,就可以写节点的事件了,贴代码///<summary>///树形⽬录菜单///</summary>///<param name="sender"></param>///<param name="e"></param>/// AfterSelect事件是点击节点时的事件private void MenutreeView_AfterSelect(object sender, TreeViewEventArgs e){string nodeselect = ;switch (nodeselect){case"⽤户管理": ShowUsermanager(); break;case"竞赛项⽬管理": ShowItemFrm(); break;case"参赛单位管理": ShowDepartFrm(); break;case"运动员信息": ShowMemberInfoFrm(); break;case"代表队名单": ShowMatchTeamFrm(); break;case"随机分组": ShowRandomGroupFrm(); break;case"分组信息": ShowGroupInfoFrm(); break;case"评分管理": ShowPointFrm(); break;case"成绩管理": ShowScoreFrm(); break;default: break;}}看到了吧,还是⽐较简单,case到以后,执⾏相应的⽅法即可,本例中主要是show⼀些窗⼝。
《treeview使用方法介绍》建立一个窗体,在窗体上放置如下控件:Treeview 控件:名称 Treeview1; Imagelist 控件:名称 Imagelist1,并在该控件中放置三张个性图片(32×32),建立索引1、2、3;(方法:在Imagelist 控件上单击鼠标右键选择属性) Label 控件:名称分别为Lab(0)、Lab(1),Caption分别为“父节点:”、“子节点:”; Textbox 控件:名称分别为Txt(0)、Txt(1),text都为“”; commandbutton 控件:名称为系统默认,Caption分别为“添加”、“展开”、“收起”、“排序”、“删除”、“退出”; 将下列代码加入到代码框:Option ExplicitDim I As IntegerDim J As IntegerDim nodx As NodeDim CunZai As Boolean '定义变量Private Sub Command1_Click() If Txt(0).Text <> "" And Txt(1).Text <> "" Then '不允许建立零字节的父节点和子节点 CunZai = False J = TreeView1.Nodes.Count For I = 1 To TreeView1.Nodes.Count '检查新输入的父节点名称是否存在 If TreeView1.SelectedItem.Children > 0 Then If Txt(0).Text = TreeView1.Nodes(I).Text Then CunZai = True End If Next I If CunZai = True Then '若存在, 则在父节点下建立子节点 Set nodx = TreeView1.Nodes.Add(Txt(0).Text, tvwChild, "child" & J, Txt(1).Text, 3) Else ,若不存在,则建立父节点和子节点 Set nodx = TreeView1.Nodes.Add(, , Txt(0).Text, Txt(0).Text, 1) Set nodx = TreeView1.Nodes.Add(Txt(0).Text, tvwChild, "child" & J,_ Txt(1).Text, 3) End If TreeView1.Refresh ElseIf Txt(0).Text = "" Then MsgBox "请输入父节点名称!", vbInformation, "警告!" '系统提示 ElseIf Txt(1).Text = "" Then MsgBox "请输入子节点名称!", vbInformation, "警告!" End IfEnd SubPrivate Sub Command2_Click() For I = 1 To TreeView1.Nodes.Count TreeView1.Nodes(I).Expanded = True '展开所有节点 Next IEnd SubPrivate Sub Command3_Click() For I = 1 To TreeView1.Nodes.Count TreeView1.Nodes(I).Expanded = False '收起所有节点 Next IEnd SubPrivate Sub Command4_Click() TreeView1.Sorted = True '排列顺序End SubPrivate Sub Command5_Click() If TreeView1.SelectedItem.Index <> 1 Then TreeView1.Nodes.Remove TreeView1.SelectedItem.Index '删除选定的节点 End IfEnd SubPrivate Sub Command6_Click() End '退出程序End SubPrivate Sub Form_Load() TreeView1.LineStyle =TvwTreeLines '在兄弟节点和父节点之间显示线 TreeView1.ImageList = ImageList1 '链接图像列 TreeView1.Style = tvwTreelinesPlusMinusPictureText '树状外观包含全部元素 Set nodx = TreeView1.Nodes.Add(, , "蒲子明", "蒲子明", 1) '建立名称为"蒲子明"的父节点,选择索引为1的图像 Set nodx = TreeView1.Nodes.Add("蒲子明", tvwChild, "child01", "收件箱", 3) '在"蒲子明"父节点下建立"收件箱"子节点,选择索引为3的图像 Set nodx = TreeView1.Nodes.Add("蒲子明", tvwChild, "child02", "发件箱", 3) '在"蒲子明"父节点下建立"发件箱"子节点,选择索引为3的图像 CunZai = FalseEnd SubPrivate Sub TreeView1_Expand(ByVal Node As MSComctlLib.Node) Node.ExpandedImage = 2 '节点被展开时,选择索引为2的图像End SubPrivate Sub TreeView1_NodeClick(ByVal Node As MSComctlLib.Node) If TreeView1.SelectedItem.Children = 0 Then '检查是否有子节点,0为无 For I = 1 To TreeView1.Nodes.Count If TreeView1.Nodes(I).Selected Then MsgBox "您选择的是:“" & TreeView1.Nodes(I).FullPath & "”子节点!" '系统提示 End If Next I End IfEnd Sub图片如下:关于treeview控件的研究心得1、关于checked属性checked属性就是在每个列项前面出现一个方框可以通过打勾来表明是否选中。
t r e e v i e w的使用方法-CAL-FENGHAI.-(YICAI)-Company One1delphi中Treeview的使用介绍每一个节点下子节点形成这一节点的Items属性,当前节点有一个唯一的Index(TreeNode的Index属性),用于说明子节点在Items中的位置,每一个节点下的子节点是顺序编号的,第一个是0,第二个是1,依次类推。
用IndexOf 方法获得子节点的顺序,绝对顺序 (AbsoluteIndex)则是指从Treeview第一个项开始的顺序值,第一个是0,如此推下去。
Item属性则根据Index的值返回当前节点的第Index个子节点。
Count则表明属于此项的所有子节点的数量。
用MoveTo方法将Item由一个位置移到另一个位置。
Expanded属性表明是否所有的子项都全部展开(包括子项的子项),为True表示全部展开。
IsVisible属性表明一个项是否在树中能被看到,如果树全部展开那么这个Item是肯定可以被看到。
HasChildren属性表明一个项是否有子项。
GetFirstChild, GetLastChild, GetPrevChild, and GetNextChild分别返回当前项子项的第一个、最后一个和前一个、后一个项。
GetNextSibling and GetPrevSibling则返回在同一Level下的下一个和上一个项。
GetNextVisible and GetPrevVisible则返回能看得到的下一个和上一个项。
如果一个节点有Parent,则HasAsParent方法返回True. Parent为当前项的父项。
Focused属性确定焦点是否落在此节点上,被Focus时会一个标准的方框围住。
很显然,只有一个节点会被聚焦。
Selected属性表明一个节点是否被选中,同样只有一个节点会被选中。
DropTarget属性表明节点在拖动操作中是源还是目标。
VB中TreeView的用法和几个实例VB中TreeView的用法和几个实例*****************************************1、为树状浏览器控件添加节点和子节点用ADD方法添加一个新节点到树状浏览器的NODES集合时,可以声明它是和已存在的节点所联系起来的。
通常使用ADD方法,其语法如下:Nodes.Add(relative,[relationship][,key][,text][,image][,selecte dimage])各个参数的意义如下:relationship 参数是通过关系节点参数与新节点连接的另一个节点;relationship 参数可能是以下情况:tvwlast--1;该节点置于所有其他的在relative中被命名的同一级别的节点的后面tvwNext--2;该节点置于在relative中被命名节点的后面tvwPrevius--3;该节点置于在relative中被命名的节点的前面tvwChild--4;该节点成为在relative中被命名的节点的的子节点下面是一个例子:Dim node1,node2,node3,node4 as Nodeset Node1=TreeView1.Nodes.AddTreeView1.Nodes(1).text="node1"TreeView1.Nodes(1).key="node1"Set node2=treeview.nodes.add("node1",tvwChild,"node2") TreeView1.Nodes(2).text="node2"TreeView1.Nodes(2).key="node2"依次插入节点即可。
2、为节点插入图象treeview1.node(3).image="leaf"注意我们一般从imagelist中指定图象3、处理节点的点击,怎样才能知道树状浏览器的哪一个节点被点击了呢?可以用NodeClick 事件:public sub treeview1_nodeclick(byval node as comctllib.node) text1.text="you click"&node.textend sub*********************************************************2、TreeView的使用,及选中其中指定的节点’=============Private Sub Command1_Click()Dim nodeY As NodeFor Each nodeY In TreeView1.NodesIf CStr(Trim(nodeY.Text)) = "ff" ThennodeY.Selected = TrueTreeView1.SetFocusExit ForEnd IfNextPrivate Sub Form_Load()/doc/95892732.html,mandType = adCmdTextRs1.RecordSource = "select distinct biao,zu from test order by zu"Rs1.RefreshDim Rs As ADODB.RecordsetSet Rs = Rs1.RecordsetSet nodX = TreeView1.Nodes.Add(, , "r", "报表组 ")i = 0Dim TempString As StringDim TempKey As LongDo Until Rs.EOF Or Rs.BOFIf TempString = Rs!zu ThenSet nodeX = TreeView1.Nodes.Add("Z" & TempKey, tvwChild, "B" & i, Rs!biao)ElseSet nodX = TreeView1.Nodes.Add("r", tvwChild, "Z" & i, Rs!zu) Set nodeX = TreeView1.Nodes.Add("Z" & i, tvwChild, "B" & i, Rs!biao)TempString = Rs!zuTempKey = iEnd IfRs.MoveNexti = i + 1Loop**********************************************************3'功能:选择Treeview节点下所有节点'----------------------------------------------------------------------------Private Sub Form_Load()TreeView1.Checkboxes = TrueTreeView1.Nodes.Add , "R", "root", "root"TreeView1.Nodes.Add "root", tvwChild, "key1", "aa"TreeView1.Nodes.Add "key1", tvwChild, "key11", "ccc"TreeView1.Nodes.Add "root", tvwChild, "key2", "bb"TreeView1.Nodes.Add "key2", tvwChild, "key21", "ddd"TreeView1.Nodes.Add "key2", tvwChild, "key211", "eee"For I = 1 To TreeView1.Nodes.CountTreeView1.Nodes(I).Expanded = TrueNextEnd SubPrivate Sub CheckChild(ByVal Node As MSComctlLib.Node, ByVal bCheck As Boolean, Optional ByVal bNext As Boolean = True, Optional ByVal bChild As Boolean = True)If Not Node Is Nothing ThenNode.Checked = bCheckIf Node.Children And bChild ThenCall CheckChild(Node.Child, bCheck, True, True) '对子节点End IfIf bNext ThenCall CheckChild(Node.Next, bCheck, True, bChild) '对同一层节点End IfEnd IfEnd SubPrivate Sub TreeView1_NodeCheck(ByVal Node As MSComctlLib.Node)Call CheckChild(Node, Node.Checked, False, True) '处理子节点End Sub。
程序设计风格、几个控件、递归在TreeView中的使用
(2007-05-31 20:31:24)
转载▼
分类:.NET
又来了,这次是Level 100,木哈哈,简单总结及有些小细节需要注意的地方。
应用程序的设计风格大致上分三种:MDI,SDI,资源管理器。
所谓MDI
的意思是多文档应用程序,例如Excel,程序的特点是有父窗口,也叫容器窗口,其他窗口均包含在父窗口内,是大多数复杂应用程序的设计风格。
SDI就是单文档界面应用程序,例如Winrar,特点是只有一个底层窗口,所有弹出窗口均以ShowDialog方式显示,适合功能简单,需求不高的应用程序。
资源管理器,这种设计风格基本上都要使用到两个控件-TreeView及 ListView,这种设计风格很少独立使用,多与以上两种混合使用,尤以MDI风格居多。
MDI/SDI共有的特点还有菜单栏(MenuStrip)、工具栏(ToolStrip)、状态栏(StatusStrip)。
MDI/SDI所用到的普通控件就那么几种,
MenuStrip,ToolStrip,StatusStrip,ImageList,Timer等等,都是拖拽就能搞定,简单的很,但是几点需要注意。
1.如果是MDI风格,记得将主窗体的IsMdiContainer属性设置为true,并new新窗口对象后指定其父窗体,且不要调用ShowDialog()方法。
2.控件一般都有几个属性比较需要注意,一个是Dock 属性,一个是Anchor,一个是 AutoSize,Dock是定义要绑定到控件的边框,简单的说就是控件的排列方式,Anchor是当主窗体缩放时,控件的边缘与哪边距离保持不变,AutoSize是设置控件是否自动调整大小以适应容器大小,比较明显一个例子,VS2003里加个StatusBar,然后加几个Panel,然后就开始调Panel 大小,当用VS2005加个StatusStrip,加几个StatusLabel,好了,大小调不了了,这里就需要设置 StatusLabel的AutoSize属性,改为False就OK了。
3.除了上面三个,还要注意各个控件的Items Collection,各种Style及各种Alignment。
我这篇文章想多写一点TreeView及ListView,这两种控件不是我们拖拖拽拽就搞的定的,而且TreeView与数据库联系紧密,也涉及到一个很麻烦的东西-递归(Recursion),ListView则涉及到四种呈现方式,在某些方面,ListView 还是比DataGridView优秀的,话不多说,扔一个例子。
示例1:实现简单的Windows资源管理器
窗体:
界面左边是个TreeView,右边是个ListView,因为是简单实现,没有各种ico,当在左边选择节点时,右边显示相应文件夹中的内容(注意,即包含文件夹,也包含文件)。
OK,先分析,TreeView中的内容在窗体Load的时候需要做什么工作?贱人甲跳出来大喊:“查询出所有节点及节点下的节点及节点下的节点下的节点……显示到TreeView中”林大少将之一脚T飞,这是不科学的,贱人乙跳出来大喊:“老子电脑牛 B,性能有保障!”林大少将之一脚T飞,这也是不科学的,我这破电脑不说了,要是你160G里全是文件,窗体Load时查询全部文件,那得了,数分钟内你别干别的了,等吧。
为了提高程序性能,最科学的是窗体生成时,产生两级节点,为什么产生两级?不产生两级你盘符前面就没+号。
太丑,然后应该再写 TreeView的BeforeExpand事件,当点击节点时,继续产生下一级的下一级节点,以此类推。
节点事件中,不要取得事件源的节点就把它当参数去调GetChild方法,仔细考虑考虑应该知道为什么。
递归是个比较难理解的方法,很容易被绕进去,我举个简单的例子,我们可以大概看一下递归是个什么流程。
示例2:用递归做1到10的递加。
OK就这么几行,你光死盯着看绝对要被绕进去,你加断点一步一步走都不一定看的明白,我建议还是拿笔写写,当传个1进去,程序怎么走的?好,程序走到 i+getNum(++i),写出来就是1+getNum(2),OK,调用自身,2进来了运行到i+getNum(++i),变成了 1+2+getNum(3)了,依次类推,最后变成
1+2+3+...+9+getNum(10),当10进来的时候,符合条件,return一个10,表
达式于是变成1+2+3+...+9+10,return了回去,于是就实现了1到10的累加,需要注意的是如果需要使用递归算法,需要指定Break 条件,不然跟死循环没什么区别,OK,反过来看示例1的递归取得节点的绝对路径方法:
好了这个跟刚才我们写的那个原理一样,如果看不懂,还是建议拿笔写写看,bine是将两个string组合生成一个路径字符串,好了写来看看,当node 传进来运行到bine(GetPath(node.Parent), node.Text),接着把node.Parent当参数调自身,表达式变成
bine((bine(node.Parent.Parent),node.Parent.Text),node .Text),举个实际的例子,打个比方,E:\Program Files\MSDN\MSDN8.0这个文件夹,当我们要取MSDN8.0的绝对路径的时候,我们传的是MSDN8.0,进了方法,bine(GetPath("MSDN"),"MSDN8.0"),好,再次调用,
bine((bine(GetPath("Program Files")),"MSDN"),"MSDN8.0"),再调(别嫌麻烦。
)
bine((bine(bine(GetPath("E:"),"Program Files")),"MSDN"),"MSDN8.0"),好了,再次调用的时候满足条件了,因为E:上面没节点了,也就是GetPath("E:")将返回node.Text,也就是返回"E:",那最里层的Combine方法将返回"E:\Program Files",往外走,倒数第二层返回"E:\Program Files\MSDN",继续走,最后一层返回"E:\Program
Files\MSDN\MSDN8.0",这就是这个递归程序路线的大致走向,因此你可以看出,要灵活的运用递归是有一定难度的,除了需要大量的积累,还需要有点感觉。
最后ListView里显示节点内文件、文件夹代码:
又跟HTML代码较上劲了,写注释老是出问题,不写了,只需要注意几个地方就行了,System.IO.Directory或者 System.IO.DirectoryInfo都是目录级别操作的类,而File或者FileInfo都是文件级别操作的类,每种两个,Directory 及File类主要是工具类,其中的方法都是静态方法,如果没有特殊需要可以使用这两个类,剩下两个都是有实例方法的类,与前面两个大体相同,少许的不同,比如FileInfo及DirectoryInfo都有Name属性,可以直接获得文件或者文件路径的文件名,看需求情况,另外 ListView介绍的比较少,主要注意下该控件的四种文件呈现方式及ListViewItem第一列的赋值方法就可以了,其他的与ListBox用法差不多。