日期:2014-05-18  浏览次数:20447 次

高分提问, treeview小问题
网上看到几个差不多的代码:
C# code

using System;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using Microsoft.Web.UI.WebControls;
using System.Data.SqlClient;



namespace hzquery.menu
{
 /// <summary>
 /// menu_Left 的摘要说明。
 /// </summary>
 public class menu_Left : System.Web.UI.Page
 {
  [color=#FF0000]protected Microsoft.Web.UI.WebControls.TreeView tvMenu;[/color]
  SqlConnection Conn;
  SqlDataAdapter myCmd;
  DataSet ds;
  string cmdSelect;



  private void Page_Load(object sender, System.EventArgs e)
  {
   Conn=new SqlConnection(Application["ConnString"].ToString());
   CreateDataSet();
   [color=#FF0000]InitTree(tvMenu.Nodes,"0");[/color]
  }
  //建立数据集
  private DataSet CreateDataSet()
  {
   cmdSelect="select * from S_Menu";
   myCmd=new SqlDataAdapter(cmdSelect,Conn);
   ds=new DataSet();
   myCmd.Fill(ds,"tree");
   return ds;
  }
  //建树的基本思路是:从根节点开始递归调用显示子树 
 [color=#FF0000]        private void InitTree(TreeNodeCollection Nds,string parentId)[/color]  {
   DataView dv=new DataView();
   [color=#FF0000]TreeNode tmpNd;[/color]
   string intId;
   dv.Table=ds.Tables["tree"];
   dv.RowFilter="ParentId="" + parentId + """ ;
   foreach(DataRowView drv in dv)
   {
    tmpNd=new TreeNode();
    tmpNd.ID=drv["NodeId"].ToString();
    tmpNd.Text=drv["NodeName"].ToString();
    tmpNd.ImageUrl="../images/"+drv["Icon"].ToString();
    tmpNd.NavigateUrl="../"+drv["Address"].ToString();
    Nds.Add(tmpNd);
    intId=drv["ParentId"].ToString();
    InitTree(tmpNd.Nodes,tmpNd.ID);
   }
  }



  #region Web Form Designer generated code
  override protected void OnInit(EventArgs e)
  {
   InitializeComponent();
   base.OnInit(e);
  }
  private void InitializeComponent()
  {    
   this.Load += new System.EventHandler(this.Page_Load);



  }
  #endregion
 }
}


第一个红色的地方, 那tvMenu没看到初始化, 它这样能通过?
第三、四个红色的地方, 那里定义的没包名做为前缀会产生岐义。
请问如何改进,或者谁可以提供个完整的。本人.net菜鸟(*^_^*)...

------解决方案--------------------
那tvMenu没看到初始化, 它这样能通过
-------
还没有用到它,可以只是申明一下。用的时候再实例化也行;


 那里定义的没包名做为前缀会产生岐义


不是很明白你的意思,TreeNode 属于System.Web.UI.WebControls命名空间。 某个列属于哪个命名空间可以自己查询的,在VS的菜单栏的视图的对象管理器中可以查询。
------解决方案--------------------
TreeNode tmpNd;
这句就是树的初始化
------解决方案--------------------
你说的第一个地方,那是因为这棵树是一个控件放置在界面上,所有放置在界面上的控件的实例化已经被挪走,不象2003那样还放置在你看到的代码文件里。
第三第四个地方是一个递归函数,你说的是没有空间名称,他既然能编译通过,说明在他所引用到的空间中再没有第二个跟他完全一样的定义,也就是说他本是已经具有唯一性,所以不需要加空间名称。加空间名称的本质就是确定类的唯一性。
------解决方案--------------------
mark
------解决方案--------------------
探讨
TreeNode tmpNd;
这句就是树的初始化

------解决方案--------------------

------解决方案--------------------
VS2005中代码的隐藏文件不可见,不是没有初始化,VS2003,与Vs2008都可以看到代码隐藏文件,就是一个控件的初始化相关的

其实VS已经做了初始化


红色的地方没有看到,那里是标红的不清楚
------解决方案--------------------
tvMenu不用初始化是因为在html中有一个
HTML code
<asp:TreeView ID="tvMenu" runat="server">

------解决方案--------------------