下面代码是我绑定TREEVIEW的节点
现在出现了个问题,
1.循环添加第2层 节点的时候,把数组存到 节点的Tag属性里,可是不管取哪个节点的值,取出来的时候每个节点的值都是,数据库最后一条记录的值?????(读取数据没问题)
存 :                                         saveNode[0] = dr.GetValue(0).ToString();
saveNode[1] = dr.GetValue(1).ToString();
saveNode[2] = dr.GetValue(2).ToString();
rootNT = new TreeNode(dr.GetString(3),0,0);

nT.Nodes.Add(rootNT);
rootNT.Tag = saveNode;
取:
string[] saveNode = (string[])this.treeTerminal.SelectedNode.Tag;
BaseTerminal.TerminalID = int.Parse(saveNode[0]);
BaseTerminal.TerminalName = this.treeTerminal.SelectedNode.Text;忘高手指教,不知道算法是否有问题
具体代码如下:
#region 绑定数据TreeView 
public void initTreeView(TreeView treeTerminal)
{
TreeNode nT = new TreeNode(BaseTerminal.TerminalName,1,1);
nT.Text = "终端列表";
treeTerminal.Nodes.Add(nT);
//TerminalDb tb = new TerminalDb();
SqlDataReader dr = this.initDr();
int i = 1;
int[] drRoot = new int[500];
TreeNode rootNT = null;
string[] saveNode = new string[3];
while(dr.Read())
{
drRoot[i] = int.Parse(dr.GetValue(0).ToString());

if(drRoot[i - 1] != drRoot[i] || i == 1)
{
saveNode[0] = dr.GetValue(0).ToString();
saveNode[1] = dr.GetValue(1).ToString();
saveNode[2] = dr.GetValue(2).ToString();
rootNT = new TreeNode(dr.GetString(3),0,0);

nT.Nodes.Add(rootNT);
rootNT.Tag = saveNode;

}
if(!dr.IsDBNull(4))
{
saveNode[0] = dr.GetValue(4).ToString();
saveNode[1] = dr.GetValue(5).ToString(); TreeNode nodeT = new TreeNode(dr.GetValue(6).ToString(),2,2);

rootNT.Nodes.Add(nodeT);
nodeT.Tag = saveNode;
i++;
}
}
dr.Close();
nT.Expand();
}

解决方案 »

  1.   

    是不是应该把
    i++;
    放到第二个if的外面呢?
      

  2.   

    帮定多麻烦,我直接取,直接读到treeview里面,n层也没问题阿
    写两个方法
    方法1:主要添加一级节点,从数据库中把所有1层都找出来!
    然后循环!有几个1层就循环几次!并且添加以后用变量数组保存起来!
    方法2:主要添加子集节点,从数据库中找,一共有几层节点,比如最高5层,就循环5次,每一次都分开来这里我写一下代码:
    数据库结构
    id,Relate,Levels,Name分别是id,跟随,多少级,名称
    数据显示分别是
    1 -1 1 模块管理
    2 1 2 添加...
    3 1 2 -
    4 1 2 退出
    5 2 3 文件
    6 2 3 目录
    9 -1 1 工会
    10 9 2 王
    11 9 2 张
    12 10 3 李
    13 10 3 赵
    14 12 4 阿
    然后写方法
    方法1
    public static Object[] AddObjCase(DataSet ds,string table,Object ObjRef)//添加主对象//用于添加主次关系树型结构对象
    {
    Object[] ObjAddItem=null;
    try
    {
    ObjAddItem=new Object[ds.Tables[table].Rows.Count];
    for(int i=0;i<ObjAddItem.Length;i++)
    {
    if(ObjRef is TreeView)
    {
    ObjAddItem[i]=new TreeNode(ds.Tables[table].Rows[i][3].ToString());
    ((TreeView)ObjRef).Nodes.Add((TreeNode)ObjAddItem[i]);
    }
    }
    }
    catch(Exception ErrCase)
    {
    MessageBox.Show(ErrCase.Message);
    }
    return ObjAddItem;
    }
    方法2
    public static Object[] AddObjCase(DataSet ds1,DataSet ds2,string table,Object[] ObjRef)
    {
    Object[] ObjAddItem=null;
    try
    {
    if(ObjRef[0] is TreeNode)//判断是否为菜单
    {
    ObjAddItem=new TreeNode[ds1.Tables[table].Rows.Count];
    for(int s=0;s<ObjAddItem.Length;s++)//添加2级以上菜单
    {
    for(int m=0;m<ObjRef.Length;m++)//循环主ds菜单
    {
    //判断主ds菜单中的id与当前子ds菜单的mnuRelate值是否相等
    if(Convert.ToInt32(ds2.Tables[table].Rows[m][0]).CompareTo(Convert.ToInt32(ds1.Tables[table].Rows[s][1]))==0)
    {
    for(int i=0;i<ObjRef.Length;i++)//查找已添加的1级菜单中与其上一级程序相对应的名称,以便在此添加它的下级菜单
    {
    //如果父级菜单中对应菜单名与其数据集中的值对应
    if(((TreeNode)ObjRef[i]).Text.CompareTo(ds2.Tables[table].Rows[m][3])==0)
    {
    ObjAddItem[s]=new TreeNode(ds1.Tables[table].Rows[s][3].ToString());
    ((TreeNode)ObjRef[i]).Nodes.Add((TreeNode)ObjAddItem[s]);
    }
    }
    }
    }
    }
    }
    }
    catch(Exception ErrCaseSon)
    {
    MessageBox.Show(ErrCaseSon.Message);
    }
    return ObjAddItem;
    }
    看懂了就会用了哦,这是我以前写的
      

  3.   

    跟i++没关系,断点执行到数组
    saveNode[0] = dr.GetValue(0).ToString();
    saveNode[1] = dr.GetValue(1).ToString();
    saveNode[2] = dr.GetValue(2).ToString();
    都没问题,值全部正确,可是,为什么给Tag后,在读每个节点是最后一个数据库的值了。操!!是不是跟 引用有关系??不清楚!
      

  4.   

    //*******为变动的地方!!!#region ?定数据TreeView 
    public void initTreeView(TreeView treeTerminal)
    {
    TreeNode nT = new TreeNode(BaseTerminal.TerminalName,1,1);
    nT.Text = "?端列表";
    treeTerminal.Nodes.Add(nT);
    //TerminalDb tb = new TerminalDb();
    SqlDataReader dr = this.initDr();
    int i = 1;
    int[] drRoot = new int[500];
    TreeNode rootNT = null;
    string[] saveNode; //**************
    while(dr.Read())
    {
    drRoot[i] = int.Parse(dr.GetValue(0).ToString());

    if(drRoot[i - 1] != drRoot[i] || i == 1)
    {
        saveNode = new string[3];//*************
    saveNode[0] = dr.GetValue(0).ToString();
    saveNode[1] = dr.GetValue(1).ToString();
    saveNode[2] = dr.GetValue(2).ToString();
    rootNT = new TreeNode(dr.GetString(3),0,0);

    nT.Nodes.Add(rootNT);
    rootNT.Tag = saveNode;

    }
    if(!dr.IsDBNull(4))
    {
    saveNode[0] = dr.GetValue(4).ToString();
    saveNode[1] = dr.GetValue(5).ToString(); TreeNode nodeT = new TreeNode(dr.GetValue(6).ToString(),2,2);

    rootNT.Nodes.Add(nodeT);
    nodeT.Tag = saveNode;
    i++;
    }
    }
    dr.Close();
    nT.Expand();
    }
      

  5.   


    string[] saveNode = new string[3];
    放到which里面试试!