要实现的功能:    点击treeview控件节点前的+号扩展节点时(不是双击该节点),以这个节点为关键字从数据库中查找一些字段,用这些字段作为新节点,插入到该节点下。我的代码如下:
1、自定义节点变量:
    private TreeNode selectNode;1、首先在鼠标的mouseDown事件得到单击哪个节点:
    selectNode = treeView1.GetNodeAt(e.X,e.Y);
    
2、在treeView控件的BeforeExpand事件中:
    
   OleDbDataAdapter monthAdapter = new OleDbDataAdapter("select distinct month(时间)         from account where year(时间)= '"+treeView1.SelectedNode.Text+"' ",mycon);
   DataSet monthDataSet = new DataSet();
   monthAdapter.Fill(monthDataSet,"monthtable");
     
   foreach(DataRow mondr in monthDataSet.Tables[0].Rows)
    {
TreeNode  monthNode = new TreeNode(mondr[0].ToString());
selectNode.Nodes.Clear();
selectNode.Nodes.Add(monthNode);
    }按理说这样应该是没有问题的,但运行时点节点前的+号展开该节点,下面的子节点还是原来那些节点,新建立的节点一个都没进来。(双击节点展开却可以实现)。最后没招了,我先把当前选择节点(treeView1.SeclectedNode)设为selectNode,插入完再恢复,这样才得以有个初步的解决:TreeNode tempNode = treeView1.SelectedNode;
treeView1.SelectedNode= selectNode;
OleDbDataAdapter monthAdapter = new OleDbDataAdapter("select distinct month(时间) from account where year(时间)= '"+treeView1.SelectedNode.Text+"' ",mycon);
DataSet monthDataSet = new DataSet();
monthAdapter.Fill(monthDataSet,"monthtable");
//treeView1.SelectedNode= selectNode;(
foreach(DataRow mondr in monthDataSet.Tables[0].Rows)
   {
TreeNode monthNode = new TreeNode(mondr[0].ToString());
selectNode.Nodes.Clear();
selectNode.Nodes.Add(monthNode);
    }
treeView1.SelectedNode = tempNode;
  
可是这样窗口就明显有个当前选择节点变化的过程(尤其是当数据库中数据较多运行时间长时),给人感觉不好。 请问高手这是怎么才能解决单击+号就能添加的题啊?实在不行,告诉我怎样在改变当前选择节点时防止树形控件自动重绘也行啊

解决方案 »

  1.   

    不应该用当前选中节点,当前要点开的节点不一定被选
    应该是用e.Node就可以
      

  2.   

    wwqna(york) :
    感谢帮助,但我没有试成功,能再帮看一下吗?
    我将foreach循环中的语句改为:
    TreeNode monthNode = new TreeNode(mondr[0].ToString());
    e.Node.Nodes.Clear();
    e.Node.Nodes.Add(monthNode);
    一样没有反应
      

  3.   

    太抱歉了,是我的SQlSelect语句写错了,
    select distinct month(时间) from account where year(时间)= '"+treeView1.SelectedNode.Text+"'不应该是treeView1.SelectedNode.Text,而应该是selectNode.Text,即我自己单击的节点,或者直接是e.node.结帐