说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

treeview控件,如何让其点击结点后再从数据库中取得这个节点的下一层节点?

编辑:说三道四文库 发布时间:2018-07-18 02:32
HTML文档下载 WORD文档下载 PDF文档下载
treeview控件,如何让其点击结点后再从数据库中取得这个节点的下一层节点?
因为我的树非常庞大,一次读出来,速度会非常慢,只一层一层的去读!
大虾帮帮忙吧!成功后立马付帐!:)
UP
那就在 节点的 onclick 事件 中写读取数据库的操作不就成了么?
2.分步加载目录树
这种方法首先加载目录树的第一层节点,然后通过事件激发加载其他节点,适合于目录树结点较多,目录树结点不固定的情况。

程序如下:
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");
}
}
}
给你一段我的代码,树多庞大,都没问题。
public void root()
{
//首先得到所有根节点 dtype()是数据类,你可不管
                          DataTable dt=new DType().GetTypeTree(0).Tables[0];

TreeNode node;

foreach (DataRow dr in dt.Rows )
{
node=new TreeNode();
node.NodeData =dr["typeid"].ToString() ;
node.Text =dr["name"].ToString();

if (new DType().GetTypeInfo(Convert.ToInt32(dr["typeid"])).imagepath.ToString()=="")
{
node.ImageUrl = imagepath+"folder.gif";

}
else
{
node.ImageUrl = imagepath+new DType().GetTypeInfo(Convert.ToInt32(dr["typeid"])).imagepath.ToString();
}
node.ExpandedImageUrl = imagepath+"folderopen.gif";
node.SelectedImageUrl = imagepath+"html.gif";
node.Target =target;
node.NavigateUrl=navigateurl+"?typeid=" +node.NodeData.ToString();

TreeView1.Nodes.Add(node);
create(node);
}
}

private void create(TreeNode parentnode)
{
DataTable dt=new DType().GetTypeTree(Convert.ToInt32( parentnode.NodeData)).Tables[0];
TreeNode node;

foreach (DataRow dr in dt.Rows )
{
node=new TreeNode();
node.NodeData =dr["typeid"].ToString();
node.Text =dr["name"].ToString();
if (new DType().GetTypeInfo(Convert.ToInt32(dr["typeid"])).imagepath.ToString()=="")
{
node.ImageUrl = imagepath+"folder.gif";

}
else
{
node.ImageUrl = imagepath+new DType().GetTypeInfo(Convert.ToInt32(dr["typeid"])).imagepath.ToString();
}
node.ExpandedImageUrl = imagepath+"folderopen.gif";
node.SelectedImageUrl = imagepath+"html.gif";
node.Target =target;
node.NavigateUrl=navigateurl+"?typeid=" +node.NodeData.ToString();

parentnode.Nodes.Add(node);
create(node);
}
以上是分布加载学生信息的代码

page_load里面加载年级信息,每个年级节点有一个字节点“loading...”

当点击该节电时,激发TreeViewOnclick事件

加载该年级对应的班级,如果没有,把“loading...”改成“无数据”

如果有数据,加载班级节点,学生信息以此类推

treeview的autoposeback属性要设置true
以上是分布加载学生信息的代码

page_load里面加载年级信息,每个年级节点有一个字节点“loading...”

当点击该节电时,激发TreeViewOnclick事件

加载该年级对应的班级,如果没有,把“loading...”改成“无数据”

如果有数据,加载班级节点,学生信息以此类推

treeview的autoposeback属性要设置true
太谢谢了,真是好哥们,我这就try 一下,成功之后,结帐!:)
太谢谢了,真是好哥们,我这就try 一下,成功之后,结帐!:)
gj0001(阿江) ,你好,你可不可以把你的例子完整的列出来???
我用了三层不太好贴
我的数据类在这:GetTypeTree方法如下:
public DataSet GetTypeTree(int parentid)
{
SqlParameter[] parms=new SqlParameter[1];
parms[0]=new SqlParameter(PARM_PARENTID,parentid);

DataSet ds=SqlHelper.ExecuteDataset(SqlHelperConn.ConnStr,CommandType.Text,SQL_SELECT_TREE,parms);
return ds;
}


请问老大,你的treeview控件怎么调出来的?为什么我的ToolBox中没有该控件的图标,然后我用添加,找到的TreeView是WindowsForm的,在Web下面不现实,请问怎么才能像你们一样能够在ASP.NET下面使用啊?
AskerX(问问) 你要先去下载,安装才行,论坛上的这样的贴子很多啊,搜索一下就ok!了!
备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘