工具采集文章(一本系列随笔概览及产生的背景自己开发的豆约翰博客备份专家软件工具)
优采云 发布时间: 2021-11-06 07:24工具采集文章(一本系列随笔概览及产生的背景自己开发的豆约翰博客备份专家软件工具)
一系列论文及其背景的概述
自主研发的DouJohnson博客备份专家软件工具自问世3年多以来,深受博客写作和阅读爱好者的喜爱。同时,也有一些技术爱好者向我咨询如何实现这个软件中的各种实用功能。
该软件是使用.NET 技术开发的。为了回馈社会,特开设软件使用的核心技术专栏,为广大技术爱好者写了一系列文章。
本系列文章不仅讲解了网络采集、编辑、发布中用到的各种重要技术,还提供了很多界面开发中的解题思路和编程经验。非常适合.NET开发的初学者和中级读者。希望请多多支持。
很多初学者经常会有这样的困惑,“为什么我看了这本书,对C#的方方面面都了解了,却写不出一个像样的应用程序?”,
其实我还没有学会综合运用所学的知识,锻炼编程思维,建立学习的兴趣。我认为这个系列文章 可以帮助你,我希望如此。
开发环境:VS2008
本节源码位置:
源码下载方法:安装SVN客户端(文末提供下载地址),然后查看以下地址:
文章系列大纲如下:
网络采集软件核心技术解析系列(1)---如何使用C#语言获取博客园中某博主的所有文章链接和标题
网络采集软件核心技术解析系列(2)---如何使用C#语言获取任意站点博文的正文和标题
网络采集软件核心技术解析系列(3)---如何用C#语言将博文中的所有图片下载到本地并离线浏览
网络采集软件核心技术解析系列(4)---如何使用C#语言将html网页转换成pdf(html2pdf)
网络采集软件核心技术解析系列(5)---将任意博主的所有博文下载到内存中,通过Webbrower展示
网络采集软件核心技术分析系列(6)---将任何博主的所有博文下载到SQLite数据库中,通过Webbrower展示
网络采集软件核心技术解析系列(7)---如何使用C#语言搭建程序框架(经典Winform界面、菜单栏、树形列表、多标签界面)
网络采集软件核心技术解析系列(综合实例)
2、第七节主要内容介绍(如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左侧树形列表,右侧多个Tab界面))
如何使用C#语言搭建程序框架(经典Winform界面,顶部菜单栏,工具栏,左侧树状列表,右侧多个Tab界面)解决方案,演示如下图:可执行文件下载
演示功能介绍:
程序启动后,扫描程序所在目录的WebSiteDB文件夹(见上一节,里面存放着每个博主的所有博文和xxx.db文件),在左边的树形控件上加载数据库名称; 双击树控件为子节点,在右侧添加类似浏览器的标签界面。在新打开的界面中,会自动加载博主的博文列表信息。
三个基本原则
这个简单的框架有三个要点:
1. 递归加载树控制节点;
2. 右侧tab窗体的创建(主要使用大名鼎鼎的WeifenLuo.WinFormsUI.Docking.dll);
3. 单击树节点打开一个新窗口(前两者的组合)。
先看第一点,树控件节点的递归加载,主要代码如下:
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)判断当前标签窗口是否已经打开,如果已经打开,则激活它;如果尚未打开,则创建一个新的选项卡窗口并使这个新创建的窗口成为活动窗口。
3. 单击树节点打开一个新窗口(前两者的组合)。主要代码如下:
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窗体。
更详细的代码请自行下载学习。