我用:
this.dv=new DataView();
this.dv.RowStateFilter=DataViewRowState.CurrentRows;
TreeNode tmpNd;
this.dv.Table=this.ds.Tables["im_tasktype"];
foreach( DataRowView drv1 in this.dv)
{
tmpNd=new TreeNode(drv1["typedes"].ToString().Trim());
tmpNd.Text=drv1["typedes"].ToString().Trim();
tmpNd.ImageIndex=1;
tmpNd.SelectedImageIndex=1;

tmpNd.Tag=drv1;
Nds.Add(tmpNd);
}根据dataview建立了treeview,类似如下:node               dataview
    |--node0 ------ dataview[0]
    |--node1 ------ dataview[1]
    |--node2 ------ dataview[2]
    |--node3 ------ dataview[3]
    |--node4 ------ dataview[4]
    |--node5 ------ dataview[5]
    |--node6 ------ dataview[6]
现在鼠标点node4,用button删除node4节点:
buton事件用(1)
this.treeView1.SelectedNode.Remove();
((System.Data.DataRowView)(this.treeView1.SelectedNode.Tag)).Delete();
则,在this.treeView1.SelectedNode.Remove();完之后,实际selectnode已经被删除,跳到了下一个节点上,所以被删除的((System.Data.DataRowView)(this.treeView1.SelectedNode.Tag))不是鼠标所选中的那个node了.用(2)
((System.Data.DataRowView)(this.treeView1.SelectedNode.Tag)).Delete();
this.treeView1.SelectedNode.Remove();
通过单步调试,很惊异地发现,node5的tag变成了dataview[4]的内容,node6的tag变成了dataview[5]的内容.所以用(3)试试:
this.treeView1.SelectedNode.Remove();
foreach( DataRowView drv1 in this.dv )
{
if ( drv1["typeid"].ToString().Trim()=="04" )    //找到node4
{
drv1.Delete();
break;
}
通过调试器,同样发现,node5的tag变成了dataview[4]的内容,node6的tag变成了dataview[5]的内容.现在我就没辙了,怎么会发生这样的事呀,对于node的tag我只在树初始化的时候进行了设置。另外补充:treeview的增删改我是用对界面和ds.tables["type"]操作(实际上通过((System.Data.DataRowView)(this.treeView1.SelectedNode.Tag))访问)的方式来实现,最后在"保存"按钮中用oleDbDataAdapter1.Update(ds,"type");来完成。

解决方案 »

  1.   

    给你一点提示吧!
    private void treeView1_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
    {
        System.Windows.Forms.TreeNode tnode=new TreeNode();
        tnode=this.treeView1.GetNodeAt(e.X,e.Y);//获取鼠标点到的节点
        if (tnode!=null)//判断是点的节点还是空白地方
        {
           int x=treeView1.Nodes.IndexOf(tnode);//获取点击的节点在树中的索引
           //接下来的你应该知道怎么做了吧?!
        }
    }
      

  2.   

    你是意思是说用indexof来做唯一识别?但是tag可以是个结构,我把"type"表中的一行都放在tag里,里面的字段用在上面程序没写到的地方。如果indexof仅用来做索引的话,结果也是一样的。现在的问题是,我把选中的node remove了,然后把这行对应的tag,就是ds.tables["type"]里的一行删除了(这条记录的rowstate是deleted)。但nextnode的tag却自动指向了这行被删除的记录。所以才报了错。另外,我程序中鼠标选中treeview的node没问题。