340 likes | 530 Views
信息系统开发 (C#). 目标. 掌握 Timer 控件 掌握 TreeView 控件 掌握 ListView 控件. Timer 控件简介 3-1. 03:15:04. 在应用程序中显示实际时间. WinForms 的 Timer 控件. 按指定的时间长度显示图像. 需要一种可在程序运行时操控时间的机制. Timer 控件简介 3- 2. 拖放. Timer 控件简介 3- 3. 对特定的时刻响应. Timer 类包含在 System.Windows.Forms 命名空间中. 按照某个周期触发事件 .
E N D
目标 • 掌握Timer 控件 • 掌握 TreeView 控件 • 掌握 ListView 控件
Timer 控件简介 3-1 03:15:04 在应用程序中显示实际时间 WinForms 的 Timer 控件 按指定的时间长度显示图像 需要一种可在程序运行时操控时间的机制
Timer 控件简介 3-3 对特定的时刻响应 Timer 类包含在 System.Windows.Forms 命名空间中 按照某个周期触发事件 与用户无关,可以通过编程,在规定的时刻执行相应动作 组件与其他控件不同,它不向用户提供用户界面,因此没有必要显示在 WinForms 设计器的界面上
Timer 控件的必要性 Timer 控件为开发人员提供了一种在经过指定的时间间隔或到达指定的绝对时间时根据代码进行响应的方式
Timer 控件的属性、方法和事件 Timer 控件名的前缀是 "tmr“ 例如:tmrTicker, tmrTickTimer
Timer 控件应用程序示例 4-1 要求显示计算机运行的时间长度和应用程序运行的时间长度
Timer 控件应用程序示例 4-2 public class frmTickCounter : System.Windows.Forms.Form { private int compuTime; ………………….. 为窗体声明一个私有整型变量 private void frmTickCounter_Load(object sender, System.EventArgs e) { compuTime = Environment.TickCount; } frmTickCounter窗体的 Load 事件
Timer 控件应用程序示例 4-3 private void tmrTickTimer_Tick(object sender, System.EventArgs e) { long curTickValue = Environment.TickCount; long difference = curTickValue - compuTime; long computerHours, computerMinutes, computerSeconds; long applicationHours, applicationMinutes, applicationSeconds; //将毫秒转换成小时、分钟和秒 computerHours = (curTickValue / (3600 * 999)) % 24; computerHours = (curTickValue / (3600 * 999)) % 24; computerMinutes = (curTickValue / (60 * 999)) % 60; computerSeconds = (curTickValue / 999) % 60; applicationHours = (difference / (3600 * 999)) % 24; applicationMinutes = (difference / (60 * 999)) % 60; applicationSeconds = (difference / 999) % 60; 应用程序中使用的局部变量 将毫秒转换成小时、分钟和秒
Timer控件应用程序示例 4-4 显示每个标签的输出结果 • this.lblComputer.Text = String.Format(“这台计算机已经开机 {0} 小 • 时, {1}分钟 {2} 秒",computerHours.ToString(),computerMinutes. • ToString(),computerSeconds.ToString()); • this.lblApplication.Text = String.Format(“这个程序已经运行了 {0} 小 • 时, {1} 分钟 {2} 秒", applicationHours.ToString(), • applicationMinutes.ToString(),applicationSeconds.ToString()); • } private void btnClose_Click(object sender,System.EventArgs e) { this.Close(); } 关闭应用程序
ListView 控件 2-1 选择列出项目的视图类型 可折叠的 TreeView ListView
ListView 控件 2-2 创建与 Windows 资源管理器的右窗口相似的用户界面 可用于以特定样式或视图类型显示列表项 四种视图模式,即大图标、小图标、列表和详细资料
ListView 控件的属性和方法 ListView 控件名的前缀是 “lvw“ 如:lvwList, lvwListItems
Column 集合和 Column 对象 • ListView 控件的 Columns 属性表示控件中出现的所有列标题的集合 • 列标题是 ListView 控件中包含标题文本的一个项 • ColumnHeader 对象定义在控件的 View 属性设置为“Details”值时,作为 ListView 控件的一部分显示的那些列 • 如果 ListView 控件没有没有任何列标题,并且 View 属性设置为 Details,则 ListView 控件不显示任何项
添加列标题 • 方法一: • ColumnHeader objHeader=new ColumnHeader(); • objHeader.Text="姓名"; • objHeader.TextAlign=HorizontalAlignment.Center ; • objHeader.Width=100; • lvPerson.Columns.Add(objHeader); 方法二: lvPerson.Columns.Add ( "姓名" , 60 , HorizontalAlignment.Right ) ; 添加多个列应该 如何做?
项集合和项对象 • ListView 控件的 Items 属性表示包含控件中所有项的集合 • 该属性返回 ListView.ListViewItemCollection,可以用于 ListView 中添加新项、删除项或计算可用项数
添加记录 实例化一个ListViewItem 设置各列的数值 ListViewItem lstItem = new ListViewItem ( ) ; lstItem.SubItems.Clear ( ) ; lstItem.SubItems[0].Text = reader["name"].ToString ( ) ; //第0列 lstItem.SubItems.Add ( reader["HomePhone"].ToString ( ) ) ; //第1列 。。。。。 lstItem.SubItems.Add ( reader["Email"].ToString ( ) ) ; //第n列 lvPerson.Items.Add(lstItem) 将定义好的数值添加到ListView里面 添加多行数据怎么办?
TreeView 控件 2-2 用于以节点形式显示文本或数据,这些节点按层次结构顺序排列 在 TreeView控件中,复选框和图标可以和文本一起显示 Windows 资源管理器中左窗格所包含的目录和文件是以树型视图样式排列的
节点集和节点对象 • TreeView 控件的 Nodes 属性表示为 TreeView 控件指定的树节点集 • 树节点集中的每个树节点对象可包括它本身的树节点集 • 树节点集中 Add()、Remove() 和 RemoveAt() 方法使开发人员可添加和移动集中的单个树节点
添加、修改和删除节点 3-1 • TreeView 控件以层次结构方式显示节点 • 在将新节点添加到现有 TreeView时,重要的是注意新节点所添加到的父节点 • 可用设计器模式或用户界面在 TreeView 上添加或删除节点
添加、修改和删除节点 3-2 在窗体上选择已存在的 TreeView 控件或在窗体上添加一个新控件 要使用树节点编辑器删除节点,请重复步骤 1 和 2。调用树节点编辑器,然后选择要删除的节点,单击“删除” 在“属性”窗口中单击节点属性旁的省略号 (…)按钮,调用树节点编辑器 添加到树的第一个节点是根节点, 其他节点可添加到存在根节点的树上 通过选择根节点或任何其他节点, 然后单击“添加子级”按钮,可为树添加子节点
添加、修改和删除节点 3-3 可通过编程方式向 TreeView添加节点 ………… TreeNode chNode = new TreeNode("Text for new node"); tvwTree1.currNode.Nodes.Add (chNode); ………… 可通过编程方式从 TreeView删除节点 …………. tvwTree1.Nodes.Remove(tvwTree1.currNode); // 清除所有节点 tvwTree1.Nodes.Clear(); …………… 如果没有选定要删除的节点,则会删除根节点
TreeView 控件的事件 TreeView 控件名的前缀是 "tvw" 如:tvwTree, tvwList
程序实例——需求 对TreeView的控制 显示节点的属性 列出文件夹的TreeView
添加盘符 private void FilltvwDirectory() { string[] drives = Environment.GetLogicalDrives(); //获取当前设备盘符,并添加到数组drivers[]l里面 for (int i = 0; i < drives.Length; i++) { TreeNode cRoot = new TreeNode(drives[i]); //这里可以写成 //TreeNode cRoot=new TreeNode(); //cRoot.Text=drivers[i]; tvwDirectory.Nodes.Add(cRoot); AddDirectories(cRoot); //添加该盘符下的文件夹 } } 获取盘符并添加到数组里面 将该盘符添加到TreeView并调用AddDirectories() 方法添加盘符下的文件夹
添加下一级文件夹 利用GetPathFromNode()方法获取当前节点的 路径并找到他的下级文件夹,之后添加到 DirectoryInfo数组内 private void AddDirectories(TreeNode node) { try { DirectoryInfo dir = new DirectoryInfo(GetPathFromNode(node)); DirectoryInfo[] e = dir.GetDirectories(); for (int i = 0; i < e.Length; i++) { string name = e[i].Name; if (!name.Equals(".") && !name.Equals("..")) //判断是否是上级目录 { node.Nodes.Add(new TreeNode(name)); } } } catch (Exception e) { MessageBox.Show(e.Message); } } 若文件夹不是返回上级目录标志则添加到TreeView里面
展开节点 用户点击“+”展开下一级目录时调用此事件添加下级目录 private void tvwDirectory_BeforeExpand(object source, TreeViewCancelEventArgs e) { TreeNode nodeExpanding = (TreeNode)e.Node; AddSubDirectories(nodeExpanding); } //调用AddDirectories将该节点的字节点添加到树图中该节点下 private void AddSubDirectories(TreeNode node) { for (int i = 0; i < node.Nodes.Count; i++) { AddDirectories(node.Nodes[i]); } }
排序节点 当用户点击排序复选框时触发此事件 在此事件中首先对树图排序之后调用Refresh方法 重新添加到树图上 private void chkOrder_Click(object source, EventArgs e) { this.tvwDirectory.Sorted = chkOrder.Checked; //树图排序 for (int i = 0; i < tvwDirectory.Nodes.Count; i++) { Refresh(tvwDirectory.Nodes[i]); //调用刷新树图方法,重新添加节点 } }
private void Refresh(TreeNode node) { if (node.Nodes.Count > 0) { if (node.IsExpanded) { string[] tooBigExpandedNodes = new string[node.GetNodeCount(true)]; int iExpandedNodes = Refresh_GetExpanded(node, tooBigExpandedNodes,0); string[] expandedNodes = new string[iExpandedNodes]; Array.Copy(tooBigExpandedNodes, 0, expandedNodes, 0, iExpandedNodes); node.Nodes.Clear(); AddDirectories(node); AddSubDirectories((TreeNode)node); node.Expand(); for (int j = 0; j < node.Nodes.Count ; j++) { if (node.Nodes[j].Nodes.Count > 0) {Refresh_Expand(node.Nodes[j], expandedNodes); } } } else { node.Nodes.Clear();AddDirectories(node); } } else { node.Nodes.Clear(); AddDirectories(node); } } 获取已经展开的节点,并把它存放在数组中 将当前展开的节点添加到TreeView并展开它的子节点
获取展开节点 • private int Refresh_GetExpanded(TreeNode Node, string[] • ExpandedNodes, int StartIndex) • { • if (StartIndex < ExpandedNodes.Length) • { • if (Node.IsExpanded) • { • ExpandedNodes[StartIndex] = Node.Text; • StartIndex++; • for (int i = 0; i < Node.Nodes.Count; i++) • { • StartIndex = Refresh_GetExpanded(Node.Nodes[i], • ExpandedNodes,StartIndex); • } • } • return StartIndex; • } • return -1; • } 若当前节点是展开的,则添加到数组中 递归利用Refresh_GetExpanded()方法添加子节点到数组中
展开原来已经展开的节点 • private void Refresh_Expand(TreeNode Node, string[] ExpandedNodes) • { • for (int i = ExpandedNodes.Length - 1; i >= 0; i--) • { • if (ExpandedNodes[i] == Node.Text) • { • AddSubDirectories((TreeNode) Node); • Node.Expand(); • for (int j = 0; j < Node.Nodes.Count; j++) • { • Refresh_Expand(Node.Nodes[j], ExpandedNodes); • } • return; • } • } • } 若数组中下标为i的节点就是当前节点,则添加当前 节点的子节点,并把当前节点设为展开,同时展开 当前节点的子节点
总结 • Timer 控件为开发人员提供了一种在指定时刻或指定的周期执行任务的控件 • Timer 控件的 Interval 属性表示时钟的周期,单位为毫秒 • ListView 控件用于以特定样式或视图类型显示列表项,其Items集合对象提供了对其列表项的操作 • TreeView 控件用于以节点形式显示文本或数据,这些节点按层次结构顺序排列 • TreeView控件的Nodes集合对象提供了对树型节点的操作