一 本系列随笔概览及产生的背景html
本身开发的豆约翰博客备份专家软件工具问世3年多以来,深受广大博客写做和阅读爱好者的喜好。同时也不乏一些技术爱好者咨询我,这个软件里面各类实用的功能是如何实现的。node
该软件使用.NET技术开发,为回馈社区,现将该软件中用到的核心技术,开辟一个专栏,写一个系列文章,以飨广大技术爱好者。git
本系列文章除了讲解网络采编发用到的各类重要技术以外,也提供了很多问题的解决思路和界面开发的编程经验,很是适合.NET开发的初级,中级读者,但愿你们多多支持。github
不少初学者常有此类困惑,“为何我书也看了,C#相关的各个方面的知识都有所了解,但就是无法写出一个像样的应用呢?”,数据库
这其实仍是没有学会综合运用所学知识,锻炼出编程思惟,创建起学习兴趣,我想该系列文章也许会帮到您,希望如此。编程
开发环境:VS2008浏览器
本节源码位置:https://github.com/songboriceboy/SimpleFrameWork网络
源码下载办法:安装SVN客户端(本文最后提供下载地址),而后checkout如下的地址:https://github.com/songboriceboy/SimpleFrameWork框架
系列文章提纲以下:函数
二 第七节主要内容简介(如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左边树形列表,右边多Tab界面))
如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左边树形列表,右边多Tab界面)的解决方案,演示demo以下图所示:可执行文件下载
demo功能简介:
程序启动后,扫描程序所在目录的WebSiteDB文件夹(参见上一节,里面保存着各个博主的所有博文,xxx.db文件),在左边的树形控件上加载数据库名称;双击树形控件的某个子节点,在右边新增一个相似浏览器的tab界面,在新打开的界面中,自动加载博主的博文列表信息。
三 基本原理
这个简单框架,主要有3个比较重要的地方:
1.树形控件节点的递归加载;
2.右边tab窗体的建立(主要利用了大名鼎鼎的WeifenLuo.WinFormsUI.Docking.dll);
3.点击树形节点,打开新窗口(前2者的结合)。
首先来看第一点,树形控件节点的递归加载,主要代码以下:
private void LoadWebSiteTree() { this.treeViewTask.Nodes.Clear(); TreeNode nodeRoot = new TreeNode(); nodeRoot.Text = "站点列表"; nodeRoot.Tag = -1; this.treeViewTask.Nodes.Add(nodeRoot); GetSubDirectoryNodes(nodeRoot, m_strDBFolder,true); this.treeViewTask.SelectedNode = this.treeViewTask.TopNode; }
建立根节点,而后调用GetSubDirectoryNodes函数,递归地加载子节点:
private void GetSubDirectoryNodes(TreeNode parentNode, string fullName, bool getFileNames) { if (!Directory.Exists(fullName)) { Directory.CreateDirectory(fullName); } DirectoryInfo dir = new DirectoryInfo(fullName); DirectoryInfo[] dirSubs = dir.GetDirectories(); // 为每一个子目录添加一个子节点 foreach (DirectoryInfo dirSub in dirSubs) { // 不显示隐藏文件夹 if ((dirSub.Attributes & FileAttributes.Hidden) != 0) { continue; } TreeNode node = new TreeNode(); node.Text = dirSub.Name; node.Tag = 0; node.ImageIndex = 0; parentNode.Nodes.Add(node); // 递归调用 GetSubDirectoryNodes(node, dirSub.FullName, getFileNames); } // 为每一个子目录添加一个子节点 foreach (DirectoryInfo dirSub in dirSubs) { // 不显示隐藏文件夹 if ((dirSub.Attributes & FileAttributes.Hidden) != 0) { continue; } } if (getFileNames) // 书中源码中,这部分在foreach内部,不正确 { // 获取此节点的全部文件 FileInfo[] files = dir.GetFiles(); // 放置节点后。放置子目录中的文件。 foreach (FileInfo file in files) { if (file.Extension.ToString() != ".db") continue; string strNodeName = file.Name.Remove(file.Name.Length - 3, 3); if (strNodeName == "home") continue; TreeNode node = new TreeNode(); node.Text = strNodeName; node.Tag = 1; node.ImageIndex = 1; parentNode.Nodes.Add(node); } } }
接下来看第二点,2.右边tab窗体的建立(主要利用了大名鼎鼎的WeifenLuo.WinFormsUI.Docking.dll),主要代码以下:
public DockContent ShowContent(string caption/*, Type formType*/) { DockContent frm = FindDocument(caption); if (frm == null) { Frm_TargetUrlView frm_TargetUrlView = new Frm_TargetUrlView((string)this.treeViewTask.SelectedNode.Parent.Text , m_strDBConStringPath + m_strTreeNodeName , (string)this.treeViewTask.SelectedNode.Text, this); frm_TargetUrlView.MdiParent = this; frm_TargetUrlView.WindowState = FormWindowState.Maximized; frm_TargetUrlView.Show(this.dockPanel1); frm_TargetUrlView.Focus(); frm_TargetUrlView.BringToFront(); return frm_TargetUrlView; } frm.Show(this.dockPanel1); frm.Focus(); frm.BringToFront(); return frm; }
首先调用FindDocument(caption),判断当前tab窗口是否已经打开了,若是已经打开,则激活它;若是还未打开,新建一个tab窗口,并使这个刚建立的窗口成为激活窗口。
3.点击树形节点,打开新窗口(前2者的结合)。主要代码以下:
private void treeViewTask_MouseDoubleClick(object sender, MouseEventArgs e) { Point pos = new Point(e.X, e.Y); TreeNode nodeClick = this.treeViewTask.GetNodeAt(pos); if (nodeClick.Text == "站点列表") { this.treeViewTask.ContextMenuStrip = null; return; } if (nodeClick != null && e.Button == MouseButtons.Left) { int nTag = (int)nodeClick.Tag; if (nTag == 0) return; this.treeViewTask.SelectedNode = nodeClick; LoadInfoByNode(); } ShowContent(this.treeViewTask.SelectedNode.Text); }
在树形节点的鼠标双击处理函数中,调用上面第二步的ShowContent函数,弹出对应的tab窗体。
更详细的代码请自行下载研究。