有一个TreeView,它包含了所有从数据库里面读出来的类别信息,然后对这个类别信息作添加删除修改等操作,就比如添加一个节点,跳出一个界面来输入节点的名称等信息,然后存入数据库,然后返回到包含TreeView的那个界面,此时如何刷新这个TreeView才是最好的做法呢?如果重新从数据库里面读取所有的类别信息再显示在TreeView上的话肯定大大的影响了性能,而且不容易保存TreeView原有的状态,请问常规的做法是怎样的呢?
调试欢乐多
webform 的话就麻烦多了。
只需要根据你的数据库更改情况就可以了,不需要刷新整个TreeView!
我是用frame来分割了页面,左面为TreeView,右边为另一页面。
左边点击,右边变化。不知道能不能行。
感觉挺方便的,添加完结点,刷新一下就好
如果满足楼主要求的话,我可以告诉你怎么做。
刷新完后用 EndUpdate函数
TreeView的每个节点跟一个Tag值,表示该节的唯一标志。
与数据库中的记录一一对应。
装载TreeView时顺便加入Tag值和相关的节点标题文本。
添加删除修改等操作时根据Tag值临时去取数据库中相关的资料。
操作完毕后在TreeView界面上做一下当前节点的添加删除修改处理(仅仅是处理的那个节点显示)。
另外再根据Tag值做数据库中记录的添加删除修改等处理。节点的Tag值始终不变,除非是添加或删除.
没必要全部刷新。
TreeView显示效果与数据库操作分开。
XML文件内容就是树结构.
private void NavigatorBrother()
{
//初始化导航语音编辑参数
this.InitNavigatorPara() ; //打开编辑导航语音对话框
FormNavigatorEdit formNavigatorEdit = new FormNavigatorEdit(NavigatorType.AddBrother) ;
formNavigatorEdit.ShowDialog() ;
//取消新建同级语音目录
if ( Pub.NavEdtSave == false )
{
this.InitNavigatorPara() ; //初始化导航语音编辑参数
return ;
}
//新建同级XML节点
XmlDocument doc = new XmlDocument();
doc.Load(Pub.XMLNavigator);
string XPath = "//Navigator[@ID=\"" + treeViewNavigator.SelectedNode.Parent.Tag.ToString() + "\"]" ;
XmlNode pNode = doc.DocumentElement.SelectSingleNode(XPath) ;
XmlElement elem = doc.CreateElement("Navigator") ;
elem.SetAttribute("ID", zDateTime.DtTmID()) ; //ID值
elem.SetAttribute("Type", "Tree") ; //类型
elem.SetAttribute("Title", Pub.NavEdtTitle) ; //标题
elem.SetAttribute("Re", Pub.NavEdtRe) ; //注释
pNode.AppendChild(elem) ;
doc.Save(Pub.XMLNavigator) ; //保存或删除语音文件
if ( File.Exists(Pub.TempWAV) )
{
djcvt.WavetoPcm(Pub.TempWAV, Pub.VOCPathNavigator + "\\" + elem.Attributes["ID"].Value + ".pcm") ;
File.Delete(Pub.TempWAV) ;
}
else
{
string FileToDelete = Pub.VOCPathNavigator + "\\" + elem.Attributes["ID"].Value + ".pcm" ;
if ( File.Exists(FileToDelete) ) File.Delete(FileToDelete) ;
}
//新建同级树节点
treeViewNavigator.SelectedNode.Parent.Nodes.Add(Pub.NavEdtTitle) ;
treeViewNavigator.SelectedNode.Parent.LastNode.Tag = elem.Attributes["ID"].Value ;
treeViewNavigator.SelectedNode = treeViewNavigator.SelectedNode.Parent.LastNode ;
treeViewNavigator.SelectedNode.ImageIndex = treeViewNavigator.SelectedNode.Index + 1 ;
treeViewNavigator.SelectedNode.SelectedImageIndex = treeViewNavigator.SelectedNode.Index + 1 ;
}
#endregion
private void NavigatorEdit()
{
#region //编辑TreeView项
if ( this.treeViewNavigator.Focused )
{
Pub.NavEdtSave = false ;
Pub.NavEdtTag = this.treeViewNavigator.SelectedNode.Tag.ToString() ; XmlDocument doc = new XmlDocument();
doc.Load(Pub.XMLNavigator);
string XPath = "//Navigator[@ID=\"" + Pub.NavEdtTag + "\"]" ;
XmlNode xNode = doc.DocumentElement.SelectSingleNode(XPath) ; Pub.NavEdtVoice = Pub.VOCPathNavigator + "\\" + xNode.Attributes["ID"].Value + ".pcm" ;
if ( !File.Exists(Pub.NavEdtVoice) )
Pub.NavEdtVoice = "" ;
Pub.NavEdtTitle = xNode.Attributes["Title"].Value ;
Pub.NavEdtRe = xNode.Attributes["Re"].Value ;
}
#endregion #region //编辑ListView项
if ( this.listViewNavigator.Focused )
{
//确认编辑项是否为空
if ( this.listViewNavigator.SelectedItems.Count == 0 )
{
MessageBox.Show("请选择要编辑的导航语音!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information) ;
return ;
}
Pub.NavEdtSave = false ;
Pub.NavEdtTag = this.listViewNavigator.SelectedItems[0].Tag.ToString() ; XmlDocument doc = new XmlDocument();
doc.Load(Pub.XMLNavigator);
string XPath = "//Navigator[@ID=\"" + Pub.NavEdtTag + "\"]" ;
XmlNode xNode = doc.DocumentElement.SelectSingleNode(XPath) ; Pub.NavEdtVoice = Pub.VOCPathNavigator + "\\" + xNode.Attributes["ID"].Value + ".pcm" ;
if ( !File.Exists(Pub.NavEdtVoice) )
Pub.NavEdtVoice = "" ;
Pub.NavEdtTitle = xNode.Attributes["Title"].Value ;
Pub.NavEdtRe = xNode.Attributes["Re"].Value ;
}
#endregion
#region //打开编辑导航语音对话框
FormNavigatorEdit formNavigatorEdit = new FormNavigatorEdit(NavigatorType.EditNormal) ;
formNavigatorEdit.ShowDialog() ;
#endregion
#region //取消编辑
if ( Pub.NavEdtSave == false )
{
this.InitNavigatorPara() ; //初始化导航语音编辑参数
return ;
}
#endregion
#region //保存编辑过的TreeView项
if ( this.treeViewNavigator.Focused )
{
//修改后的标题显示
treeViewNavigator.SelectedNode.Text = Pub.NavEdtTitle ;
//保存到Navigator.xml
XmlDocument doc = new XmlDocument();
doc.Load(Pub.XMLNavigator);
string XPath = "//Navigator[@ID=\"" + Pub.NavEdtTag + "\"]" ;
XmlNode xNode = doc.DocumentElement.SelectSingleNode(XPath) ; //保存或删除语音文件
if ( File.Exists(Pub.TempWAV) )
{
djcvt.WavetoPcm(Pub.TempWAV, Pub.VOCPathNavigator + "\\" + xNode.Attributes["ID"].Value + ".pcm") ;
File.Delete(Pub.TempWAV) ;
}
else
{
string FileToDelete = Pub.VOCPathNavigator + "\\" + xNode.Attributes["ID"].Value + ".pcm" ;
if ( File.Exists(FileToDelete) ) File.Delete(FileToDelete) ;
} xNode.Attributes["Title"].Value = Pub.NavEdtTitle ;
xNode.Attributes["Re"].Value = Pub.NavEdtRe ; doc.Save(Pub.XMLNavigator) ;
this.SetNavigatorToolBarButtonAfterSelectTree() ;
}
#endregion #region //保存编辑过的ListView项
if ( this.listViewNavigator.Focused )
{
//修改后的标题显示
this.listViewNavigator.SelectedItems[0].Text = Pub.NavEdtTitle ;
//保存到Navigator.xml
XmlDocument doc = new XmlDocument();
doc.Load(Pub.XMLNavigator);
string XPath = "//Navigator[@ID=\"" + Pub.NavEdtTag + "\"]" ;
XmlNode xNode = doc.DocumentElement.SelectSingleNode(XPath) ; //保存语音文件
if ( File.Exists(Pub.TempWAV) )
{
djcvt.WavetoPcm(Pub.TempWAV, Pub.VOCPathNavigator + "\\" + xNode.Attributes["ID"].Value + ".pcm") ;
File.Delete(Pub.TempWAV) ;
} xNode.Attributes["Title"].Value = Pub.NavEdtTitle ;
xNode.Attributes["Re"].Value = Pub.NavEdtRe ; doc.Save(Pub.XMLNavigator) ;
this.SetNavigatorToolBarButtonAfterSelectLeaf() ;
}
#endregion
}
#endregion
private void NavigatorDelete()
{
#region //删除树
if ( this.treeViewNavigator.Focused )
{
TreeNode CurrentNode = treeViewNavigator.SelectedNode ;
//确认删除
if ( DialogResult.Cancel == MessageBox.Show("是否真的删除导航语音目录 [ " + CurrentNode.Text + " ] ?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) )
return ;
XmlDocument doc = new XmlDocument() ;
doc.Load(Pub.XMLNavigator) ;
//选择当前树节点及其所包含的子节点
string XPath = "//Navigator[@ID=\"" + CurrentNode.Tag.ToString() + "\"]/descendant-or-self::*" ;
XmlNodeList xNodeList = doc.DocumentElement.SelectNodes(XPath) ;
for ( int i = 0; i < xNodeList.Count; i++ ) //删除语音文件
{
string VoiceFile = Pub.VOCPathNavigator + "\\" + xNodeList[i].Attributes["ID"].Value + ".pcm" ;
if ( File.Exists(VoiceFile) ) File.Delete(VoiceFile) ;
} //选择当前树节点本身
XPath = "//Navigator[@ID=\"" + CurrentNode.Tag.ToString() + "\"]/self::*" ;
xNodeList = doc.DocumentElement.SelectNodes(XPath) ;
xNodeList[0].ParentNode.RemoveChild(xNodeList[0]) ; //删除XML节点
doc.Save(Pub.XMLNavigator) ; //保存XML文件 //如果不是当前层的最后一个节点则刷新同级节点图标
bool LastNode = false ;
if ( treeViewNavigator.SelectedNode.NextNode == null )
LastNode = true ; treeViewNavigator.SelectedNode.Remove() ; //删除树节点
this.SetNavigatorToolBarButtonAfterSelectTree() ; //刷新按钮显示 if ( !LastNode )
{
for ( int i = 0; i < treeViewNavigator.SelectedNode.Parent.Nodes.Count; i++ )
{
treeViewNavigator.SelectedNode.Parent.Nodes[i].ImageIndex = i + 1 ;
treeViewNavigator.SelectedNode.Parent.Nodes[i].SelectedImageIndex = i + 1 ;
}
}
}
#endregion #region //删除叶
if ( this.listViewNavigator.Focused )
{
//确认删除项是否为空
if ( this.listViewNavigator.SelectedItems.Count == 0 )
{
MessageBox.Show("请选择需要删除的导航语音文件!", "提示", MessageBoxButtons.OK, MessageBoxIcon.Information) ;
return ;
} //确认删除
if ( DialogResult.Cancel == MessageBox.Show("是否真的删除所选的导航语音文件?", "提示", MessageBoxButtons.OKCancel, MessageBoxIcon.Question) )
return ;
//删除语音文件及XML文件节点
XmlDocument doc = new XmlDocument() ;
doc.Load(Pub.XMLNavigator) ;
string XPath = "" ;
XmlNodeList xNodeList ;
for ( int i = 0; i < listViewNavigator.SelectedItems.Count; i++ )
{
string CurrentTag = listViewNavigator.SelectedItems[i].Tag.ToString() ;
string VoiceFile = Pub.VOCPathNavigator + "\\" + CurrentTag + ".pcm" ;
if ( File.Exists(VoiceFile) ) File.Delete(VoiceFile) ; XPath = "//Navigator[@ID=\"" + CurrentTag + "\"]/self::*" ;
xNodeList = doc.DocumentElement.SelectNodes(XPath) ;
xNodeList[0].ParentNode.RemoveChild(xNodeList[0]) ; //删除XML节点
}
doc.Save(Pub.XMLNavigator) ; //保存XML文件 //删除ListView导航叶
while ( listViewNavigator.SelectedItems.Count != 0 )
this.listViewNavigator.SelectedItems[0].Remove() ; //确定焦点
if ( this.listViewNavigator.Items.Count == 0 )
this.treeViewNavigator.Select() ;
else
{
listViewNavigator.Items[listViewNavigator.Items.Count - 1].Focused= true ;
listViewNavigator.Items[listViewNavigator.Items.Count - 1].Selected = true ;
listViewNavigator.Select() ;
}
}
#endregion
}
#endregion