真是郁闷啊,我在编写形成树的程序时,居然给我提示“使用了未赋值的局部变量rootNode”,下面是我的部分代码,我的rootNode变量可是在while里进行了赋值的啊。
    private void InitDeptTree()
    {
        Infragistics.WebUI.UltraWebNavigator.Node rootNode;    //这里我使用了Infragistics系列控件组.        string strconn = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
        SqlConnection conn = new SqlConnection(strconn);
        SqlCommand cmd = new SqlCommand("Select Company_Name from OA_Company", conn);
        conn.Open();
        SqlDataReader sdr = cmd.ExecuteReader();
        while (sdr.Read())
        {  //这实际上是到表里去读取树的树结点的信息,这个表里只有一条记录。
            string rootname = sdr.GetSqlString(0).ToString();
            rootNode = DeptTreeView.Nodes.Add(rootname, -1);     //这里不就对rootNode进行了赋值了吗?
        }
        Label1.Text = rootNode.ToString();      
    //这一句是我加的测试语句,问题就出在这里,提示说“使用了未赋值的局部变量。如果我将这一句放进While语句里,即rootNode=DeptTreeView.Nodes.Add(rootName,-1);后的话,系统就不会提这个错误。难道这个rootNode变量一离开While循环后,它的值就没有了吗????
        conn.Close();
       .......
    }

解决方案 »

  1.   

    如果sdr根本就读不到任何记录的话,rootNode是没有机会被赋值的。
      

  2.   

    声明的时候同时赋个null就好了。Infragistics.WebUI.UltraWebNavigator.Node rootNode=null; 
      

  3.   

    string rootname="";
    while (sdr.Read()) 
            {  //这实际上是到表里去读取树的树结点的信息,这个表里只有一条记录。 
                rootname = sdr.GetSqlString(0).ToString(); 
                rootNode = DeptTreeView.Nodes.Add(rootname, -1);    //这里不就对rootNode进行了赋值了吗? 
            } 
            Label1.Text = rootNode.ToString();   
      

  4.   


    sdr肯定能读到记录,而且只有一条记录。
      

  5.   

    我一气这么干了:
         SqlDataReader sdr = cmd.ExecuteReader();
         将这个While语句取消,反正该表里只有一条记录。当然这个程序在实际中可能崩溃,那就是表里真的没有一条记录。
         sdr.Read();
         string rootname = sdr.GetSqlString(0).ToString();
        rootNode = DeptTreeView.Nodes.Add(rootname, -1);这样一来,该错误不提示了,运行也正常,但这是为什么呢?  没超过变量的使用范围,但未啥就出现”未赋值“的错误提示呢?
      

  6.   

    那你在while后再加一条判断,若rootNode的值不会空才实行Label1.Text = rootNode.ToString(); 看看有怎么变化?若没问题的话说明原先的肯定有空记录的出现
      

  7.   

    断点调试一下不就知道了吗?
    while是在为TRUE的时候才循环,如果第一次就为FALSE的话呢?那肯定就退出循环了啊!//这实际上是到表里去读取树的树结点的信息,这个表里只有一条记录
    不过你这样说了,那就不清楚了
      

  8.   


    因为.NET不能保证你循环里面一定有值,类似于使用 Session["dddd"].ToString() 的时候不管里面有没有值一定要判定是否为null,否则.NET就会报错
      

  9.   

    UP, 一开始就对rootNode赋一个初值吧.
      

  10.   

    Label1.Text = rootNode==null?"":rootNode.ToString();
      

  11.   

    还有就是检查一下DeptTreeView.Nodes.Add(rootname, -1); 确保这里返回的不是null?
      

  12.   

    object XXX = new object();//这里new是必须的,不然编译通不过
    //if块/switch块/while之类有条件判断的块内对XXX赋值;
    object yyy = xxx;//这样才不会出错.
      

  13.   

    Infragistics.WebUI.UltraWebNavigator.Node rootNode = null;
      

  14.   

    如果sdr根本就读不到任何记录的话,rootNode是没有机会被赋值的。