csdn上一高手的代码没找到原出处,不知道对你是否有用!
public class WebForm1 : System.Web.UI.Page
{
protected Microsoft.Web.UI.WebControls.TreeView TrvStuInfo;
private DataSet objDataSet = new DataSet();
protected System.Web.UI.WebControls.Table Table1;
private db DB=new db();

private void Page_Load(object sender, System.EventArgs e) 
{
if (!this.IsPostBack)
{
DB.CreateDataSet("grade",objDataSet);
intiTreeGrade(TrvStuInfo.Nodes,0);
}
}
private void intiTreeGrade(TreeNodeCollection Nds , int parentId)
{
DataView dv=new DataView() ;
TreeNode tmpNd;
int strId;
dv.Table = objDataSet.Tables["TrvNodeGrade"];

foreach(DataRowView objRow in dv)
{
tmpNd=new TreeNode();
strId=(int)objRow["GradeId"];
tmpNd.ID=strId.ToString();
tmpNd.Text=objRow["GradeName"].ToString();
tmpNd.ExpandedImageUrl ="images/folderopen.gif";
tmpNd.ImageUrl="images/folder.gif" ;
tmpNd.NavigateUrl =objRow["GradeUrl"].ToString() ;
tmpNd.Target="main";
Nds.Add(tmpNd);                
}    foreach(TreeNode TN in TrvStuInfo.Nodes)
{
tmpNd=new TreeNode();
tmpNd.Text="Loading....";
TN.Nodes.Add(tmpNd);               
}   
}
private void intiTreeClass(TreeNodeCollection Nds ,int parentId)
{
DataView dv=new DataView() ;
TreeNode tmpNd;
dv.Table = objDataSet.Tables["TrvNodeClass"];
dv.RowFilter = "GradeNodeId='" + parentId.ToString() + "'"; 

foreach(DataRowView objRow in dv)
{
tmpNd=new TreeNode();
tmpNd.Text=objRow["ClassName"].ToString();
tmpNd.ExpandedImageUrl ="images/folderopen.gif";
tmpNd.ImageUrl="images/folder.gif" ;
Nds.Add(tmpNd);
tmpNd=new TreeNode();
tmpNd.Text="Loading....";
Nds[Nds.Count-1].Nodes.Add(tmpNd);               
}   
if (Nds.Count!=1)
{
Nds[0].Remove();
}
else
{
Nds[0].Remove();
tmpNd=new TreeNode();
tmpNd.Text="无数据";
Nds.Add(tmpNd);
         }
} private void intiTreeStudent(TreeNodeCollection Nds ,string parentId)
{
DataView dv=new DataView() ;
TreeNode tmpNd;
dv.Table = objDataSet.Tables["TrvNodeStudent"];
dv.RowFilter = "GradeNodeId='" + (int.Parse(parentId.Substring(0,1))+1) + "' and ClassId='" + (int.Parse(parentId.Substring(2,1))+1) +"'"; 
foreach(DataRowView objRow in dv)
{
tmpNd=new TreeNode();
tmpNd.Text=objRow["StudentName"].ToString();
tmpNd.ImageUrl ="images/man.gif";
tmpNd.NavigateUrl ="StuInfoRight.aspx?stuId=" + objRow["StudentId"];
tmpNd.Target="main";
Nds.Add(tmpNd);
tmpNd=new TreeNode();              
}   
if (Nds.Count!=1)
{
Nds[0].Remove();
}
else
{
Nds[0].Remove();
tmpNd=new TreeNode();
tmpNd.Text="无数据";
Nds.Add(tmpNd);
}
} public void TreeViewOnclick(object sender,TreeViewClickEventArgs e)
{
if (e.Node.Length!=1 )
{       
if (TrvStuInfo.Nodes[int.Parse(e.Node.Substring(0,1))].Nodes[int.Parse(e.Node.Substring(2,1))].Nodes.Count==1)
{
DB.CreateDataSet("student",objDataSet); intiTreeStudent(TrvStuInfo.Nodes[int.Parse(e.Node.Substring(0,1))].Nodes[int.Parse(e.Node.Substring(2,1))].Nodes, e.Node);
}
}
else
{
if (TrvStuInfo.Nodes[int.Parse(e.Node)].Nodes.Count==1 )
{
DB.CreateDataSet("class",objDataSet);
intiTreeClass(TrvStuInfo.Nodes[int.Parse(e.Node)].Nodes, int.Parse(e.Node)+1);
}
}

}
底层数据库连接类如下:public class db
{
public db()
{
}
public void CreateDataSet(string DsType ,DataSet objDataSet) 
{
SqlDataAdapter objAdapter;
SqlConnection objCn=new SqlConnection(ConfigurationSettings.AppSettings["DsnWroxBooksSql"]);
if (DsType=="grade")
{
objCn.Open();
string strSql  ="select * from V_Student_TrvNodeGrade";
objAdapter=new SqlDataAdapter(strSql,objCn);
objAdapter.Fill(objDataSet,"TrvNodeGrade");
} if (DsType=="class")
{
objCn.Open();
string strSql  ="select * from V_Student_TrvNodeClass";
objAdapter=new SqlDataAdapter(strSql,objCn);
objAdapter.Fill(objDataSet,"TrvNodeClass");
} if (DsType=="student")
{
objCn.Open();
string strSql  ="select * from V_Student_TrvNodeStudent";
objAdapter=new SqlDataAdapter(strSql,objCn);
objAdapter.Fill(objDataSet,"TrvNodeStudent");
}
}
}
以上是分布加载学生信息的代码
page_load里面加载年级信息,每个年级节点有一个字节点“loading...”
当点击该节电时,激发TreeViewOnclick事件
加载该年级对应的班级,如果没有,把“loading...”改成“无数据”
如果有数据,加载班级节点,学生信息以此类推
treeview的autoposeback属性要设置true

解决方案 »

  1.   

    你在Expand事件中判断该node是否Expand和是否有子节点,如果没有,增加子节点,再Expanded=true再次执行Expand事件,如果有,那么不执行增加子节点代码 public void InitTree(TreeView treeDept)
    { treeDept.Nodes.Clear();
    TreeNode nodeDept=new TreeNode();
    nodeDept.ID="0";
    nodeDept.Text="部门机构";
    nodeDept.NodeData="-1";
    treeDept.Nodes.Add(nodeDept);
    dsDept=dataObject.GetDeptDataSet();
    InitDeptTree(nodeDept,"0");
    nodeDept.Expanded=true;
    } private void InitDeptTree(TreeNode nodeDept, string strDeptId)
    {
    string strCondition="ParentId='"+strDeptId+"'";
    DataRow[] row=dsDept.Tables[0].Select(strCondition); for(int i=0; i<=row.GetUpperBound(0);i++)
    {
    TreeNode nodeTemp=new TreeNode(); 
    nodeTemp.ID=row[i][0].ToString();
    nodeTemp.Text=row[i][1].ToString();
    nodeTemp.NodeData=row[i][2].ToString();
    nodeDept.Nodes.Add(nodeTemp);
    InitDeptTree(nodeTemp,nodeTemp.ID);
    }
    } public void RefreshTree(TreeView treeDept)
    {
    TreeNode nodeDept=CurrentNode(treeDept);
    string strDeptId=GetDeptId(treeDept);
    dsDept=dataObject.GetDeptDataSet();
    nodeDept.Nodes.Clear();
    InitDeptTree(nodeDept,strDeptId);
    nodeDept.Expanded=true;
    }
      

  2.   

    to:cropcoco(曼_柯) :  不止expand时间通过什么方式触发?
      

  3.   

    对不起,字错了!:to:cropcoco(曼_柯) :  不知expand事件通过什么方式触发?
      

  4.   

    建议动态添加结点不要回传到服务器,直接在客户端处理。
    如果结点是从数据库读取的请用 Javascript 调用 WebService 来实现,这样子不会造成屏幕闪烁。