private void Page_Load(object sender, System.EventArgs e) { // Put user code to initialize the page here if (IsPostBack==false) { this.sqlDataAdapter1.Fill(this.dataSet11); TreeNode rootNode=new TreeNode(); AddTree(1,null);
id title level rootid 其中title是类别名称 level是目录的级别 rootid 是从属于父级的id和自身的id 比如 1 最新新闻 1 1 2 热点新闻 1 2 3 玉米 2 1,3 记录id=3的是从属于“最新新闻”它的级别是2级菜单,所以level=2 rootid=1,3如果是oracle数据库一个关键字就都出来了。 select id, title from table_name start with rootid is null prior by id = rootid
不好意思上面的SQL打错了,正确的如下 select id, lpad(title, lengthb(title)+4*(level-1), '*') title from table_name start with rootid is null connect by prior id = rootid
{
// Put user code to initialize the page here
if (IsPostBack==false)
{
this.sqlDataAdapter1.Fill(this.dataSet11);
TreeNode rootNode=new TreeNode();
AddTree(1,null);
}
}// 递归添加树的节点
public void AddTree(int ParentID, TreeNode pNode)
{
// DataSet ds=(DataSet) this.ViewState["ds"];
DataView dvTree = new DataView(this.dataSet11.Tables[1]);
//过滤ParentID,得到当前所有子节点
dvTree.RowFilter = "[PARENTID] = " + ParentID; foreach(DataRowView Row in dvTree)
{
TreeNode Node=new TreeNode() ;
if(pNode == null)
{ //添加根节点
TreeView1.Nodes.Add(Node);
Node.Expanded = false;
}
else
{ //添加当前节点的子节点
pNode.Nodes.Add(Node);
Node.Expanded = false;
} Node.Text = Row["context"].ToString();
AddTree(Int32.Parse(Row["id"].ToString()), Node);//递归
Node.Target = "frright";
Node.NavigateUrl = Row["depth"].ToString();
Node.ImageUrl = Row["image"].ToString() ;
Node.ExpandedImageUrl = Row["image"].ToString();
}
}
string TextFiledName,string TagFiledName)
{
System.Windows.Forms.TreeNode Node = new System.Windows.Forms.TreeNode();
Node.Text = RootName;
Node.Tag = 0;
Node.Checked = true; Common.SQLTransfer.FillDataSet(ds,TableName,Common.GlobalData.ConnStr,System.Data.CommandType.Text,Sql);
int Count = ds.Tables[TableName].Rows.Count;
for ( int i = 0; i < Count; i ++ )
{
System.Windows.Forms.TreeNode LeafNode = new System.Windows.Forms.TreeNode();
LeafNode.Text = ds.Tables[TableName].Rows[i][TextFiledName].ToString();
LeafNode.Tag = int.Parse(ds.Tables[TableName].Rows[i][TagFiledName].ToString());
LeafNode.Checked = false;
LeafNode.Nodes.Add("test");
Node.Nodes.Add(LeafNode);
}
return Node;
}
前提是数据库中字段标识时候为根节点和父节点
id title level rootid
其中title是类别名称
level是目录的级别
rootid 是从属于父级的id和自身的id
比如
1 最新新闻 1 1
2 热点新闻 1 2
3 玉米 2 1,3
记录id=3的是从属于“最新新闻”它的级别是2级菜单,所以level=2 rootid=1,3
比如ID,ParID,ID为自增字段,ParID为父节点字段,如果ParID为0(设置默认为0)则为最高一层节点,可以说是根节点,然后把ID的某一个值赋给ParID,作为其子节点,这样就可以实现无限级别镶套。至于输出,写一个递归就可以全搞定。
ID,ParID
1,0
2,1
3,2
4,3
5,3
1
--2
----3
------4
------5
你的要求不是全出来了吗?
{
string sql=null;
try
{
if(0==SortID)
sql="select * from Sorts where ParentsSortID is null";
else
sql="select * from Sorts where ParentsSortID="+SortID.ToString();
if(ConnectionState.Open!=myConn.State)
{
myConn.ConnectionString=DBInfo.ConnStr;
myConn.Open();
} SqlDataAdapter myAdapter=new SqlDataAdapter(sql,myConn);
DataSet myDs=new DataSet();
myAdapter.Fill(myDs,"SortInfo");
if(null!=myDs)
for(int i=0;i<myDs.Tables["SortInfo"].Rows.Count;i++)
{
tnc.Add(myDs.Tables["SortInfo"].Rows[i][1].ToString().Trim());
tnc[tnc.Count-1].Tag=myDs.Tables["SortInfo"].Rows[i][0].ToString();
int k=int.Parse(myDs.Tables["SortInfo"].Rows[i][0].ToString());
if(CheckNullSort(k))
UpdateSortTreeView(k,tnc[i].Nodes);
}
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
if(0==SortTreeView.Nodes.Count)
{
btnSortProperty.Enabled=false;
btnSortEdit.Enabled=false;
btnSortDel.Enabled=false;
}
else
{
btnSortEdit.Enabled=true;
btnSortDel.Enabled=true;
}
} private bool CheckNullSort(int SortID)
{
string sql=null;
try
{
if(ConnectionState.Open!=myConn.State)
{
myConn.ConnectionString=DBInfo.ConnStr;
myConn.Open();
}
sql="select count(*) from Sorts where ParentsSortID="+SortID.ToString();
SqlDataAdapter chkAdapter=new SqlDataAdapter(sql,myConn);
DataSet chkDs=new DataSet();
chkAdapter.Fill(chkDs,"chkClass");
if(int.Parse(chkDs.Tables["chkClass"].Rows[0][0].ToString())>0)
return true;
else
return false;
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
return false;
}
} private void SortManageFrm_Load(object sender, System.EventArgs e)
{
UpdateSortTreeView(0,SortTreeView.Nodes);
} private void DeleteSort(int SortID)
{
string sql=null;
try
{
if(ConnectionState.Open!=myConn.State)
{
myConn.ConnectionString=DBInfo.ConnStr;
myConn.Open();
}
if(CheckNullSort(SortID))
{
sql="select * from sorts where parentssortid="+SortID.ToString();
SqlDataAdapter myAdapter=new SqlDataAdapter(sql,myConn);
DataSet myDs=new DataSet();
myAdapter.Fill(myDs,"SortInfo");
if(null!=myDs)
for(int i=0;i<myDs.Tables["SortInfo"].Rows.Count;i++)
{
DeleteSort(int.Parse(myDs.Tables["SortInfo"].Rows[i][0].ToString()));
}
}
sql="delete from Sorts where SortID="+SortID.ToString();
SqlCommand exeCmd=new SqlCommand(sql,myConn);
exeCmd.ExecuteNonQuery();
}
catch(Exception ex)
{
MessageBox.Show(ex.Message);
}
} private void btnSortDel_Click(object sender, System.EventArgs e)
{
if(null!=SortTreeView.SelectedNode)
{
if(DialogResult.Yes==MessageBox.Show("是否要删除此分类?","确认删除分类",MessageBoxButtons.YesNo,MessageBoxIcon.Question))
{
DeleteSort(int.Parse(SortTreeView.SelectedNode.Tag.ToString()));
SortTreeView.Nodes.Clear();
UpdateSortTreeView(0,SortTreeView.Nodes);
}
}
else
MessageBox.Show("请选择您要删除的分类!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
} private void btnSortAdd_Click(object sender, System.EventArgs e)
{
if(null!=SortTreeView.SelectedNode)
{
if(SortTreeView.Nodes.Count>0)
{
AddSortFrm myAdd=new AddSortFrm(int.Parse(SortTreeView.SelectedNode.Tag.ToString()),"添加"+SortTreeView.SelectedNode.Text+"分类");
myAdd.ShowDialog();
}
else
{
AddSortFrm myAdd=new AddSortFrm(0,"添加分类");
myAdd.ShowDialog();
}
}
else
{
AddSortFrm myAdd=new AddSortFrm(0,"添加分类");
myAdd.ShowDialog();
}
SortTreeView.Nodes.Clear();
UpdateSortTreeView(0,SortTreeView.Nodes);
} private void SortTreeView_AfterSelect(object sender, System.Windows.Forms.TreeViewEventArgs e)
{
if(0==SortTreeView.SelectedNode.Nodes.Count)
btnSortProperty.Enabled=true;
else
btnSortProperty.Enabled=false;
} private void btnSortEdit_Click(object sender, System.EventArgs e)
{
if(null!=SortTreeView.SelectedNode)
{
ModifySortFrm myMod=new ModifySortFrm(int.Parse(SortTreeView.SelectedNode.Tag.ToString()),"修改"+SortTreeView.SelectedNode.Text+"分类");
myMod.ShowDialog();
SortTreeView.Nodes.Clear();
UpdateSortTreeView(0,SortTreeView.Nodes);
}
else
MessageBox.Show("请选择您要修改的分类!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
} private void btnSortProperty_Click(object sender, System.EventArgs e)
{
if(null!=SortTreeView.SelectedNode)
{
SortPropertyFrm myProperty=new SortPropertyFrm(int.Parse(SortTreeView.SelectedNode.Tag.ToString()),SortTreeView.SelectedNode.Text);
myProperty.ShowDialog();
}
else
MessageBox.Show("请选择您要操作的分类!","提示",MessageBoxButtons.OK,MessageBoxIcon.Information);
} private void SortManageFrm_Closing(object sender, System.ComponentModel.CancelEventArgs e)
{
myConn.Close();
myConn.Dispose();
}
}
}全部操作在此,慢慢看吧.....
有这么麻烦么?
一个递归就可以了,楼主的level字段在广度遍历时是可以提高效率的
还要添加,删除数据,好象人家不知道用递归一样,你看我上面的显示也是用的递归啊.....
其中title是类别名称
level是目录的级别
rootid 是从属于父级的id和自身的id
比如
1 最新新闻 1 1
2 热点新闻 1 2
3 玉米 2 1,3
记录id=3的是从属于“最新新闻”它的级别是2级菜单,所以level=2 rootid=1,3如果是oracle数据库一个关键字就都出来了。
select id, title from table_name start with rootid is null prior by id = rootid
select id, lpad(title, lengthb(title)+4*(level-1), '*') title from table_name start with rootid is null connect by prior id = rootid
或者用for 自己写也行
免费的偶也要!嘿嘿……
[email protected]