10常用控件.doc_第1页
10常用控件.doc_第2页
10常用控件.doc_第3页
10常用控件.doc_第4页
10常用控件.doc_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

工程应用培训教材第十节 常用控件应用背景VB程序爱好者常常不满足VB提供的标准控件,期望在程序中使用更高级的且能够体现职业化特点的第三方控件,这些控件使程序功能更加丰富、用户界面更专业、满足工程的真实需求。树型控件TreeView,列表框控件ListView和表格控件FlexGrid是目前很多程序经常使用的控件,因此作为一个职业程序员,应该了解这些控件的使用方法和效果。图10-1为使用TreeView和ListView的注册表窗体图例,窗体左侧使用树型控件代表层次,右边使用列表控件显示左侧选中的内容。图10-1注册表的树型结构和内容列表知识要点(1)TreeView控件TreeView是最灵活的Windows控件之一,它以分层的形式显示数据,允许用户随意扩展或折叠节点。鉴于实际生活中许多事物有着层次关系,如计算机里的文件夹、人事组织关系、地区从属关系等,TreeView的应用也极其广泛。在新建工程中,由于TreeView控件非标准控件,需要单击“工程/部件” ,在控件列表中选中“Microsoft Windows command controls6.0(sp4)”,按下“确定”按钮返回主界面,则在左侧控件工具条中出现Treeview 控件选项。TreeView的每个结点都为Node对象,这些结点的集合为Nodes,其有基本属性和方法如下:Count:返回所有Node的结点数Add:增加结点方法,即Add(父节点key,关系,结点key,结点显示标题,图像序号) 增加根结点Set nodx = TreeView1.Nodes.Add(, , huabei, 华北, 1)增加上面根结点的子结点:Set nodx = TreeView1.Nodes.Add(huabei, tvwChild, beijing, 北京, 2)其中结点key,用于标志结点的唯一性,字符型变量;节点显示标题用于结点的显示,图像序号为显示该结点的图标在ImageList中的列表序号。Remove(Index):删除序号为index的结点,如:Remove TreeView1.SelectedItem.Index 删除选定的节点TreeView控件的属性Sorted:用于给TreeView进行排序ImageList:设置TreeView显示图标控件,如TreeView1. ImageList = ImageList1LineStyle:TreeView结点之间显示的线形,如:TreeView1.LineStyle = tvwTreeLinesStyle:TreeView击点显示的形式,如:TreeView1.Style = tvwTreelinesPictureText Refresh:刷新方法,重新显示TreeView各个结点。Clear:清除TreeView控件的所有Node结点。下列代码,完成一个地区树型结构的加载:Dim nodx As NodeTreeView1.ImageList = ImageList1TreeView1.LineStyle = tvwTreeLinesTreeView1.Style = tvwTreelinesPictureTextSet nodx = TreeView1.Nodes.Add(, , xibei, 西北, 1) Set nodx = TreeView1.Nodes.Add(xibei, tvwChild, xian, 西安, 2) Set nodx = TreeView1.Nodes.Add(xibei, tvwChild, yinchuan, 银川, 2) Set nodx = TreeView1.Nodes.Add(xibei, tvwChild, taiyuan, 太原, 2)Set nodx = TreeView1.Nodes.Add(, , xinan, 西南, 1) Set nodx = TreeView1.Nodes.Add(xinan, tvwChild, guiyang, 贵阳, 2) Set nodx = TreeView1.Nodes.Add(xinan, tvwChild, beihai, 北海, 2) Set nodx = TreeView1.Nodes.Add(xinan, tvwChild, nanning, 南宁, 2)TreeView1.Sorted = TrueTreeView1.Refresh(2)ListView控件listview控件可有4种不同的视图显示方法,跟“资源管理器”里的“查看”方式相似:0大图标、1小图标、2列表、3报表式。使用哪种视图,可由该控件的view属性设置控制,其中“报表”视图很适合用来显示数据记录。listview控件包括listItem对象和ColumnHeader对象。listItem对象为显示的数据行;ColumnHeader对象为显示的列标题。listItem对象有两部分,一部分是图标和简要描述的文本(第1列),另一部分是前者的子项文本信息(第2列,第3列.),而listItems即是对listItem对象集合(所有行)的引用,因此listItems(1) 可以表示为第1行,listitems(1).text 返回第1行第1列的文本值,listitems(1).subItem(1) 返回第1行第2列的文本值。ListView常用属性:Checkboxes:设置为true时,每一行数据前将显示一复选框。FullRowSelect:设置为true时可以整行地选择数据。GridLines:设置为true时控件将显示网格线,只作用于“报表”视图HotTracking:设置为true时,鼠标所在行将以高亮度显示。LabelWrap:设置为true时,文本标签超出列宽时可换行。SelectedItem:返回对所选ListItem对象的引用。Sorted:当值为true时,列表按字母排序。ListView常用方法:Add方法:添加listItem对象到控件中。语法格式:控件名.ListItems.add(index,key,text,icon,smallIcon)FindItem方法:查找并返回对控件中listItem对象的引用。语法格式:控件名.FindItem(string,value,index,match)ListView选定记录:selectedItem.text 返回选定行第1列文本值selectedItem.index 返回选定行的位置listItems(x).subItems(y) 返回第x行,第y+1列文本值listItems(x).checked=true 第x行复选框选定或返回值ListView清除选定行:listitems.remove(控件名.selectedItem.index)所有行的总数:listitems.count例如下列代码完成一个ListView的记录加载过程: Dim lst As ListItem ListView1.ListItems.Clear ListView1.Checkboxes = True ListView1.FullRowSelect = True ListView1.GridLines = True ListView1.HotTracking = True ListView1.LabelWrap = True ListView1.ColumnHeaderIcons = ImageList1 ListView1.SmallIcons = ImageList2 ListView1.Icons = ImageList1 ListView1.ColumnHeaders.Add , h1, 区县名称, ListView1.Width / 4, 0, 1 ListView1.ColumnHeaders.Add , h2, 电话, ListView1.Width / 4, 0, 2 ListView1.ColumnHeaders.Add , h3, 地址, ListView1.Width / 4, 0, 3 ListView1.ColumnHeaders.Add , h4, 联系人, ListView1.Width / 4, 0, 4 ListView1.ListItems.Add 1, haidian, 海淀, 3, 3 ListView1.ListItems(1).SubItems(1) = 7876665 ListView1.ListItems(1).SubItems(2) = 海淀区学院南路68号 ListView1.ListItems(1).SubItems(3) = 白先生 ListView1.ListItems.Add 2, shijingshan, 石景山, 3, 3 ListView1.ListItems.Add 3, dongcheng, 东城区, 3, 3 ListView1.ListItems.Add 4, xicheng, 西城区, 3, 3 ListView1.ListItems.Add 5, shunyi, 顺义区, 3, 3 ListView1.ListItems.Add 6, changping, 昌平区, 3, 3 ListView1.ListItems(6).SubItems(1) = 44332111 ListView1.ListItems(6).SubItems(2) = 昌平区大学城1号 ListView1.ListItems(6).SubItems(3) = 刘先生 ListView1.ListItems.Add 7, fengtai, 丰台区, 3, 3 ListView1.ListItems.Add 8, mentougou, 门头沟, 3, 3(3)MSFlexgridMsflexgrid 控件是用表格式窗体显示信息的有用工具。利用该控件可以显示和操作数据表格,对包含字符串和图片的表格提供了灵活的排序、插入数据和格式编排功能。常用属性:TextMatrix(m,n):m代表行,n代表列,返回或设置当前行列的文本,例如将文本赋值给单元格:MsFlexGrid.TextMatrix(3,1)=”Hello” Row,Col:代表所选单元列和行,例如选中行为5,列为4的单元:MsFlexGrid.Row=4;MsFlexGrid.Col=5。CellPicture:代表所选单元,单元背景,在单元格中插入背景图形:Set MsFlexGrid.CellPicture=LoadPicture(“C:temp1.bmp”) CellFontBold:代表当前单元的字体,用粗体格式化当前选中单元:MsFlexGrid.CellFontBold=TrueAllowBigSelection:设置网格样式FillStyle :填充样式RowSel:得到MSFlexGrid控件中当前选中的一行,如:msflexgrid1.Rowsel返回当前选中行。ColSel: 得到MSFlexGrid控件中当前选中的一列,如:msflexgrid1.ColSel返回当前选中列。Colwidth(Index):通过代码调节列宽度,例如:msflexgrid1.colwidth(i)=4000下列代码是对 MSFlexGrid初始化,仔细品读:MSFlexGrid1.Cols = 6MSFlexGrid1.Rows = 9MSFlexGrid1.AllowBigSelection = TrueMSFlexGrid1.FillStyle = flexFillRepeatDim i, j As IntegerMSFlexGrid1.Row = 0MSFlexGrid1.Col = 0MSFlexGrid1.Text = title0MSFlexGrid1.ColWidth(0) = MSFlexGrid1.Width / 6MSFlexGrid1.Col = 1MSFlexGrid1.Text = title1MSFlexGrid1.ColWidth(1) = MSFlexGrid1.Width / 6MSFlexGrid1.Col = 2MSFlexGrid1.Text = title2MSFlexGrid1.ColWidth(2) = MSFlexGrid1.Width / 6MSFlexGrid1.Col = 3MSFlexGrid1.Text = title3MSFlexGrid1.ColWidth(3) = MSFlexGrid1.Width / 12MSFlexGrid1.Col = 4MSFlexGrid1.Text = title4MSFlexGrid1.ColWidth(4) = MSFlexGrid1.Width / 3MSFlexGrid1.Col = 5MSFlexGrid1.Text = title5MSFlexGrid1.ColWidth(5) = MSFlexGrid1.Width / 12MSFlexGrid1.Col = 1For i = 1 To 8 MSFlexGrid1.Row = i MSFlexGrid1.ColSel = MSFlexGrid1.Cols - 1 If i Mod 2 = 0 Then MSFlexGrid1.CellBackColor = vbYellow 黄色 Else MSFlexGrid1.CellBackColor = vbBlue 兰色 End If MSFlexGrid1.TextMatrix(i, 0) = i For j = 1 To 5 MSFlexGrid1.TextMatrix(i, j) = Int(18 * Rnd) + 1 Next jNext i应用举例:例1:建立一个窗体,在窗体上增加TreeView,ListView和MSFlexGrid控件,并按照知识要点所举例子进行控件编程练习。1建立一个标准exe的工程1,选择菜单-工程-部件,部件选择画面,选择Microsoft FlexGrid Control 6.0,Microsoft Control Common Controls 6.0(SP4)和Microsoft Control Common Controls-2 6.0 (SP4),点击确认。参见如下图10-2:图10-2 工程-部件选择2在窗体Form1上添加TreeView,ListView和MSFlexGrid控件,按照上面关于TreeView,ListView和MSFlexGrid的例子编程,运行结果参见如下图10-3:图10-3 TreeView,ListView和MsFlexGrid的例子例2:数据库中一个表具有如下表格式,请使用嵌套循环方式,编程序实现该树状结构动态加载到TreeView上。idprovincecityidcitymasteraddresstelephonezipDb东北db04长春0222Db东北db05哈尔滨0333222Db东北db02齐齐哈尔0Db东北db02抚顺0222Db东北db01沈阳0沈阳11111Db东北db03大连022233333Hb华北hb05张家口0Hb华北hb01北京0333Hb华北hb02石家庄033Hb华北hb03唐山0Hb华北hb04丰宁01在上面建立的工程1中,增加一个窗体Form2,向窗体Form2中增加TreeView控件。2在该项目当前目录下,建立一个Access数据库db1.mdb,具有如上表所示数据的Station表。3在工程添加一个数据环境,更改名称为DE1,数据连接对象为Conn;点击Conn对象,更改其数据连接属性为连接Access数据库Rptdb.mdb。步骤参见图10-4,图10-5,图10-6。图10-4 连接数据库Access选择驱动程序图10-5连接数据库Access选择数据库,用户名和密码图10-6连接数据库Access测试连接成功4编写TreeView的初始化函数Tree(),代码如下:Private Sub tree()Dim nodx As NodeDim rst, rst1 As ADODB.RecordsetDim strsql As StringDim i, j As LongDim strkey As StringTreeView1.ImageList = ImageList1TreeView1.LineStyle = tvwTreeLinesTreeView1.Style = tvwTreelinesPictureTextDE1.Conn.OpenSet rst = New ADODB.RecordsetSet rst1 = New ADODB.Recordsetstrsql = select distinct id , province from stationrst.Open strsql, DE1.Conn, 3, 1If rst.RecordCount 0 Then For i = 0 To rst.RecordCount - 1 strkey = Str(rst.Fields(id).Value) Set nodx = TreeView1.Nodes.Add(, , k + strkey, rst.Fields(province).Value, rst.Fields(id).Value) strsql = select * from station where id= & rst.Fields(id).Value rst1.Open strsql, DE1.Conn, 3, 1 If rst1.RecordCount 0 Then For j = 0 To rst1.RecordCount - 1 Set nodx = TreeView1.Nodes.Add(k + strkey, tvwChild, rst1.Fields(cityid).Value, rst1.Fields(city).Value, rst.Fields(id).Value) rst1.MoveNext Next j End If rst1.Close rst.MoveNext Next iEnd IfEnd Sub5. 编写窗体Form2的Load事件程序,实现数据库db1.mdb中表Station的内容加载,代码如下:Private Sub Form_Load() Call tree End Sub程序运行结果如下图10-7图10-7 程序运行结果例3:请将例2中双击树状结构结点后,将属于该结点的数据及其隶属的数据显示在ListView中。1在上述工程中,添加一个ListView控件ListView1,编写窗体的listView的初始化函数Listing(),代码如下:Private Sub listing() ListView1.ListItems.Clear ListView1.View = lvwReport ListView1.Checkboxes = True ListView1.FullRowSelect = True ListView1.GridLines = True ListView1.HotTracking = True ListView1.LabelWrap = True ListView1.ColumnHeaderIcons = ImageList1 ListView1.SmallIcons = ImageList1 ListView1.Icons = ImageList1 ListView1.ColumnHeaders.Add , h1, 城市, ListView1.Width / 4, 0, 1 ListView1.ColumnHeaders.Add , h2, 联系人, ListView1.Width / 4, 0, 2 ListView1.ColumnHeaders.Add , h3, 地址, ListView1.Width / 4, 0, 3 ListView1.ColumnHeaders.Add , h4, 电话, ListView1.Width / 8, 0, 4 ListView1.ColumnHeaders.Add , h5, 邮编, ListView1.Width / 8, 0, 5 End Sub2编写TreeView1的Click事件,将属于该结点的数据及其隶属的数据显示在ListView中,代码如下:Private Sub TreeView1_Click()Dim rs As ADODB.RecordsetDim strsql As StringDim i As LongListView1.ListItems.ClearSet rs = New ADODB.Recordsetstrsql = select * from station where cityid like + TreeView1.SelectedItem.Key + %rs.Open strsql, DE1.Conn, 3, 1If rs.RecordCount 0 Then For i = 0 To rs.RecordCount - 1 ListView1.ListItems.Add i + 1, rs.Fields(cityid).Value, rs.Fields(city).Value, 1, 1 ListView1.ListItems(i + 1).SubItems(1) = IIf(IsNull(rs.Fields(master).Value), , rs.Fields(master).Value) ListView1.ListItems(i + 1).SubItems(2) = IIf(IsNull(rs.Fields(telephone).Value), , rs.Fields(telephone).Value) ListView1.ListItems(i + 1).SubItems(3) = IIf(IsNull(rs.Fields(address).Value), , rs.Fields(address).Value) ListView1.ListItems(i + 1).SubItems(4) = IIf(IsNull(rs.Fields(zip).Value), , rs.Fields(zip).Value) rs.MoveNext Next i End IfEnd Sub当点击树型结构时,程序的运行结果如图10-8。图10-8 程序运行结果例4: msflexgrid 控件没有提供直接编辑单个单元内容的功能,然而利用文本框控件的编辑功能可以方便的克服这一局限性。请利用 msflexgrid 控件实现对表格内容进行编辑的方法。1新建标准exe工程1,在工程中增加一个MsFlesGrid控件和一个文本框控件。将文本框的 visible 的属性设为 false。在运行中当每次激活表格中的某一单元时均将文本框的大小及位置调整到与被激活的单元的大小及位置相一致,并将该单元的内容赋予文本框。同时将文本框的 visible 的属性设为 true。然后将焦点移到文本框控件上。在该单元的编辑修改结束后,将文本框的内容复制到原单元中,并将文本框的 visible 属性设为 false,然后将活动焦点改变到msflexgrid 控件上。为了在运行时使文本框的外观看起来同活动单元完全相同,在设计时需将文本框的 borderstyle 属性设为 0。在滚动表格时,为了使活动单元的内容与表格一起滚动,需将文本框的内容复制到活动单元。然后将文本框的 visible 属性设为 false。为了实现上述功能,需分别对 msflexgrid 控件的 click 事件编程和 entercell 事件、leavecell 事件、scroll 事件。各部分的程序代码如下。2msflexgrid 控件的 click 事件Private Sub MSFlexGrid1_Click() If MSFlexGrid1.Row = 0 Or MSFlexGrid1.Col = 0 Then Text1.Visible = False Exit Sub End If Text1.Text = Text1.Visible = False Text1.Top = MSFlexGrid1.Top + MSFlexGrid1.CellTop Text1.Left = MSFlexGrid1.Left + MSFlexGrid1.CellLeft Text1.Width = MSFlexGrid1.CellWidth Text1.Height = MSFlexGrid1.CellHeight Text1.Text = MSFlexGrid1.Text Text1.Visible = True Text1.SetFocusEnd Sub3msflexgrid 控件的 entercell 事件Private Sub MSFlexGrid1_EnterCell() If MSFlexGrid1.MouseRow = 0 Or MSFlexGrid1.MouseCol = 0 Then Text1.Visible = False Exit Sub End If MSFlexGrid1.Row = MSFlexGrid1.MouseRow MSFlexGrid1.Col = MSFlexGrid1.MouseCol Text1.Text = Text1.Visible = False Text1.Top = MSFlexGrid1.Top + MSFlexGrid1.CellTop Text1.Left = MSFlexGrid1.Left + MSFlexGrid1.CellLeft Text1.Width = MSFlexGrid1.CellWidth Text1.Height = MSFlexGrid1.CellHeight Text1.Text = MSFlexGrid1.Text Text1.Visible = True Text1.SetFocusEnd Sub4. msflexgrid 控件的 leavecell 事件Private Sub MSFlexGrid1_LeaveCell() If Text1.Visible = True Then MSFlexGrid1.Text = Text1.Text End IfEnd Sub5.msflexgrid 控件的 scroll 事件:Private Sub MSFlexGrid1_Scroll() If Text1.Visible = True Then MSFlexGrid1.Text = Text1.Text Text1.Visible = False End IfEnd Sub程序运行结果参见图10-9图10-9程序运行结果知识扩展:(1) 保存TreeView数据最简单的形式是XML文件,因为层次型结构是XML固有的特征。打开“工程”菜单,选择“引用”,在对话框中选中“Microsoft XML v3.0”组件。每一个节点保存为一个XML元素,节点的属性作为XML元素的属性保存,节点之间的从属关系通过元素的ParentKey属性得以体现。下面是“保存”按钮点击事件句柄的代码。Private Sub bttnSave_Click()Dim xmlDoc As DOMDocument30Set xmlDoc = New DOMDocument30Dim ElementNode As IXMLDOMElementDim RootElementNode As IXMLDOMElementSet ElementNode = xmlDoc.createElement(NODES)Set RootElementNode = xmlDoc.appendChild(ElementNode)Dim TNode As NodeDim i As IntegerFor i = 1 To SmartTreeView.Nodes.CountSet TNode = SmartTreeView.Nodes(i)Set ElementNode = xmlDoc.createElement(NODE)ElementNode.setAttribute Caption, TNode.TextElementNode.setAttribute Key,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论