有一个TreeView,它包含了所有从数据库里面读出来的类别信息,然后对这个类别信息作添加删除修改等操作,就比如添加一个节点,跳出一个界面来输入节点的名称等信息,然后存入数据库,然后返回到包含TreeView的那个界面,此时如何刷新这个TreeView才是最好的做法呢?如果重新从数据库里面读取所有的类别信息再显示在TreeView上的话肯定大大的影响了性能,而且不容易保存TreeView原有的状态,请问常规的做法是怎样的呢?

解决方案 »

  1.   

    tangyong12(海洋之星) :还有我觉得有另外一点就是如果是多用户环境下同时操作的话,光更新一条会导致数据无法同步而出错吧?
      

  2.   

    winform 的话当然是只刷新那个修改了的treenode好,要全部刷新是比较懒的方法。
    webform 的话就麻烦多了。
      

  3.   

    你可以删除TreeView上的某一个节点,或者为某个TreeNode添加一个子树!
    只需要根据你的数据库更改情况就可以了,不需要刷新整个TreeView!
      

  4.   

    你问问题的时候,应该先说明是在winform还是webform方式下工作
      

  5.   

    应该先说明是在winform还是webform方式下工作!
      

  6.   

    不好意思,疏忽了,应该是在WinForm下工作
      

  7.   

    我做的一个网站用过TreeView,
    我是用frame来分割了页面,左面为TreeView,右边为另一页面。
    左边点击,右边变化。不知道能不能行。
    感觉挺方便的,添加完结点,刷新一下就好
    如果满足楼主要求的话,我可以告诉你怎么做。
      

  8.   

    数据量大可以用 BeginUpdate函数
    刷新完后用 EndUpdate函数
      

  9.   

    可以这样做:
    TreeView的每个节点跟一个Tag值,表示该节的唯一标志。
    与数据库中的记录一一对应。
    装载TreeView时顺便加入Tag值和相关的节点标题文本。
    添加删除修改等操作时根据Tag值临时去取数据库中相关的资料。
    操作完毕后在TreeView界面上做一下当前节点的添加删除修改处理(仅仅是处理的那个节点显示)。
    另外再根据Tag值做数据库中记录的添加删除修改等处理。节点的Tag值始终不变,除非是添加或删除.
    没必要全部刷新。
    TreeView显示效果与数据库操作分开。
      

  10.   

    另外建议用XML文件存储数据。
    XML文件内容就是树结构.
      

  11.   

    回复人: ZhouQiang() ( ) 信誉:100 给点代码,,学习,学习
      

  12.   

    #region //新建同级语音目录
    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
      

  13.   

    #region //编辑
    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
      

  14.   

    #region //删除
    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