今天的主要内容是目录窗体的实现及搜索的实现
目录窗体BookIndexForm
目录窗体中,有一个ContextMenuSTrip,即右击窗体出现的菜单,里面有几个比较重要的方法
添加文件夹、添加文章、删除、重命名
添加文件夹即添加父节点, 选中可以添加文件夹的节点(显然只有根节点和目录节点),然后将新增一个CHMNode,将它Add到父节点的Nodes里面
/// <summary>
/// 添加文件夹
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AddFolderToolStripMenuItem_Click(object sender, EventArgs e)
{
TreeNode node = this.tvIndex.SelectedNode;
//选中的节点
//查看是否是根节点或是目录节点 CHMNodeList list = this.GetNodeList(node);
if (list == null || list.Count==0)
{
MessageBox.Show("请选择根节点或是目录节点");
return;
}
//创建新的节点
CHMNode newNode = new CHMNode();
newNode.Name = "新建文件夹";
newNode.ImageNo = "0";
//newNode.Nodes = new CHMNodeList();
list.Add(newNode);
System.Windows.Forms.TreeNode node2 = new TreeNode(newNode.Name);
node2.Tag = newNode;
node2.ImageIndex = 0;
node2.SelectedImageIndex = 0;
node.Nodes.Add(node2);
//将新节点添加到树中
node.ImageIndex = 0;
node.SelectedImageIndex = 0;
this.tvIndex.SelectedNode = node2;
}
/// 添加文件夹
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AddFolderToolStripMenuItem_Click(object sender, EventArgs e)
{
TreeNode node = this.tvIndex.SelectedNode;
//选中的节点
//查看是否是根节点或是目录节点 CHMNodeList list = this.GetNodeList(node);
if (list == null || list.Count==0)
{
MessageBox.Show("请选择根节点或是目录节点");
return;
}
//创建新的节点
CHMNode newNode = new CHMNode();
newNode.Name = "新建文件夹";
newNode.ImageNo = "0";
//newNode.Nodes = new CHMNodeList();
list.Add(newNode);
System.Windows.Forms.TreeNode node2 = new TreeNode(newNode.Name);
node2.Tag = newNode;
node2.ImageIndex = 0;
node2.SelectedImageIndex = 0;
node.Nodes.Add(node2);
//将新节点添加到树中
node.ImageIndex = 0;
node.SelectedImageIndex = 0;
this.tvIndex.SelectedNode = node2;
}
添加文章即添加 子节点,注意这时添加的节点他的Nodes要设为null,表示他是文章节点,不能再添加其他节点了
/// <summary>
/// 添加文章
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AddArticleToolStripMenuItem_Click(object sender, EventArgs e) {
TreeNode node = this.tvIndex.SelectedNode; CHMNodeList list = this.GetNodeList(node);
if (list == null)
{
MessageBox.Show("请选择根节点或是目录节点");
return;
}
EditForm frmEdit = new EditForm();
frmEdit.ShowDialog(this);
CHMNode NewNode = frmEdit.Node;
if(NewNode==null)
{
return;
}
list.Add(NewNode);
System.Windows.Forms.TreeNode node2 = new TreeNode(NewNode.Name);
node2.Tag = NewNode;
node2.ImageIndex = 1;
node2.SelectedImageIndex = 1;
node.Nodes.Add(node2);
//将新节点添加到树中
node.ImageIndex = 0;
node.SelectedImageIndex = 0;
this.tvIndex.SelectedNode = node2;
}
/// 添加文章
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void AddArticleToolStripMenuItem_Click(object sender, EventArgs e) {
TreeNode node = this.tvIndex.SelectedNode; CHMNodeList list = this.GetNodeList(node);
if (list == null)
{
MessageBox.Show("请选择根节点或是目录节点");
return;
}
EditForm frmEdit = new EditForm();
frmEdit.ShowDialog(this);
CHMNode NewNode = frmEdit.Node;
if(NewNode==null)
{
return;
}
list.Add(NewNode);
System.Windows.Forms.TreeNode node2 = new TreeNode(NewNode.Name);
node2.Tag = NewNode;
node2.ImageIndex = 1;
node2.SelectedImageIndex = 1;
node.Nodes.Add(node2);
//将新节点添加到树中
node.ImageIndex = 0;
node.SelectedImageIndex = 0;
this.tvIndex.SelectedNode = node2;
}
重命名:右击节点可以编辑节点的Label,
实现方法如下:
将TreeView的LabelEdit设为True,然后编写如下代码:
private void ReNameMToolStripMenuItem_Click(object sender, EventArgs e)
{
this.tvIndex.SelectedNode.BeginEdit();
}
private void tvIndex_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
this.tvIndex.SelectedNode.Name = e.Label;
TreeNode node = this.tvIndex.SelectedNode;
if (node.Tag is CHMDocument)
{
((CHMDocument)node.Tag).Title = e.Label;
}
if (node.Tag is CHMNode)
{
((CHMNode)node.Tag).Name = e.Label;
}
}
{
this.tvIndex.SelectedNode.BeginEdit();
}
private void tvIndex_AfterLabelEdit(object sender, NodeLabelEditEventArgs e)
{
this.tvIndex.SelectedNode.Name = e.Label;
TreeNode node = this.tvIndex.SelectedNode;
if (node.Tag is CHMDocument)
{
((CHMDocument)node.Tag).Title = e.Label;
}
if (node.Tag is CHMNode)
{
((CHMNode)node.Tag).Name = e.Label;
}
}
删除节点,即移除,同时还要删除文件
/// <summary>
/// 删除节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DeleteDToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Windows.Forms.TreeNode node = this.tvIndex.SelectedNode;
//获取要删除的节点
if (node == null) { MessageBox.Show("请选择一个节点");
return;
}
System.Windows.Forms.TreeNode parent = node.Parent;
//获取该节点的父节点
if (parent == null)
{
MessageBox.Show("请选择目录或页面节点");
return;
}
CHMNodeList list = GetNodeList(parent);
if (MessageBox.Show("是否删除文章(删除同时删除本地文件)?","确认", MessageBoxButtons.YesNo)== System.Windows.Forms.DialogResult.Yes) {
list.Remove((CHMNode)node.Tag);
//同时删除文件
if (System.IO.File.Exists(((CHMNode)node.Tag).Local))
{
System.IO.File.Delete(((CHMNode)node.Tag).Local);
}
node.Remove();
//移除该节点
}
}
/// 删除节点
/// </summary>
/// <param name="sender"></param>
/// <param name="e"></param>
private void DeleteDToolStripMenuItem_Click(object sender, EventArgs e)
{
System.Windows.Forms.TreeNode node = this.tvIndex.SelectedNode;
//获取要删除的节点
if (node == null) { MessageBox.Show("请选择一个节点");
return;
}
System.Windows.Forms.TreeNode parent = node.Parent;
//获取该节点的父节点
if (parent == null)
{
MessageBox.Show("请选择目录或页面节点");
return;
}
CHMNodeList list = GetNodeList(parent);
if (MessageBox.Show("是否删除文章(删除同时删除本地文件)?","确认", MessageBoxButtons.YesNo)== System.Windows.Forms.DialogResult.Yes) {
list.Remove((CHMNode)node.Tag);
//同时删除文件
if (System.IO.File.Exists(((CHMNode)node.Tag).Local))
{
System.IO.File.Delete(((CHMNode)node.Tag).Local);
}
node.Remove();
//移除该节点
}
}