静坐常思己过,闲谈莫论人非,能受苦乃为志士,肯吃亏不是痴人,敬君子方显有德,怕小人不算无能,退一步天高地阔,让三分心平气和,欲进步需思退步,若着手先虑放手,如得意不宜重往,凡做事应有余步。持黄金为珍贵,知安乐方值千金,事临头三思为妙,怒上心忍让最高。切勿贪意外之财,知足者人心常乐。若能以此去处事,一生安乐任逍遥。

无限级目录分类在下拉列表中的实现

作者:大鹏 发布于:2007-7-12 14:16 Thursday 分类:PHP&MySql

最近在做一个网站需要一个无限级下拉列表的无限级分级功能,于是就有了下面的小作品。
   开始以为无限级下拉列表功能应该很简单,无非就是用一个递归算法就好啦,但是在做起来的时候却会遇到一些比较模糊的东西。在网上找了很久也没有找到例子,没办法了,想偷懒也偷不成了,还是自己老老实实的写一个吧。不多废话,下面请看我做的详细方法。

Menu.class.php
class Menu{
 var $conn;    //这里的 $conn 是 adodb的一个数据库链接对象
 var $dbpart;   //数据库表前缀
 var $arrayList;
 var $dropdownList;
 var $toAdd = "├";
 
 function Menu($conn = NULL){
   $this->conn = $conn;
   $this->arrayList = array();
   $this->dropdownList = array();
   
 }
 
 function setConn($conn){
   $this->conn = $conn;
 }
 function setDbpart($dp){
   $this->dbpart = $dp;
 }
 
 function getAllMenuData($pid = -1){
   $db = $this->conn;
   $sql = "SELECT * FROM `".$this->dbpart."_menu` WHERE `menuPid` = '$pid'";
   $rs = $db->Execute($sql);
   while($row = $rs->FetchRow()){
     $this->arrayList[] = $row;
     $this->getAllMenuData($row[menuId]);
   }
   $rs->Close();
 }
 
 
 // 返回所有菜单列表
 function getAllMenuList(){
   $this->arrayList = array();
   $this->getAllMenuData();
   return $this->arrayList;
 }
 
 function getDropdowlistData($pid = -1){
   $db = $this->conn;
   $sql = "SELECT * FROM `".$this->dbpart."_menu` WHERE `menuPid` = '$pid'";
   $rs = $db->Execute($sql);
   while($row = $rs->FetchRow()){
     $temp = array();
     $temp[menuName] = $this->toAdd ."  ".$row[menuName];
     $temp[menuId] = $row[menuId];
     $this->dropdownList[] = $temp;
     $this->toAdd .= "─┴";
     $this->getDropdowlistData($row[menuId]);
     $this->toAdd = substr($this->toAdd, 0, strlen($this->toAdd)-6); //开始这里没有处理好,层次关系显示不出来 :),这里的 strlen一定要注意,php里面 <─┴>这两个字符在 strlen里是6,所以和C#里有些不同

   }
   $rs->Close();
 }
 
 // 返回 Dropdownlist 列表
 function getDropdownList(){
   $this->dropdownList = array();
   $this->getDropdowlistData();
   return $this->dropdownList;
 }
}
?>


test.php
 /**********************
 *   这里的 $conn 是 adodb的一个数据库链接对象
 */
 $conn->debug = true;
 $menu = new Menu($conn);
 $menu->setDbpart($dbpart);
 $menus = $menu->getDropdownList();
 
//  print_r($menus);
 for($i=0; $i  
   echo $menus[$i][menuName]."
";
   
 }

打印出来的菜单列表:
[code]
菜单管理
├─┴ 游船管理
├─┴─┴ 普通游船
├─┴ 酒店管理
├─┴─┴ 宜昌酒店
├─┴─┴ 上海酒店
├─┴─┴─┴ 上海大酒店
├─┴─┴─┴ 上海小酒店
├─┴─┴─┴ 上海A酒店
├─┴─┴─┴ 上海B酒店
├─┴─┴─┴─┴ K分店
├─┴ 再加一个
├─┴ c Sharp
├─┴─┴ .net
[/code]
和生成的树结构基本上是一致的:
点击查看原图

在下介绍一下在C#中的实现方法, 原理基本上是一样的:
//在类里边还要定义一个变量
private string toadd = "├";

private string dbpart = "rocsky";

private void getAllMenuData(string pid)

   {

       SqlConnection conn = new SqlConnection("server=.;database=test;uid=sa;pwd=;");

       string sql = "SELECT * FROM [" + dbpart +"_menu] WHERE [menuPid] = @pid";

       SqlCommand cmd = new SqlCommand(sql, conn);

       SqlParameter Pid = new SqlParameter("@pid", SqlDbType.Int);

       Pid.Value = pid;

       cmd.Parameters.Add(Pid);

       conn.Open();

       SqlDataReader sdr = cmd.ExecuteReader();

       while (sdr.Read())

       { 

           this.DropDownList1.Items.Add(new ListItem(toadd + " " + sdr[1].ToString(), sdr[0].ToString()));

           toadd += "─┴";

           this.getAllMenuData(sdr[0].ToString());

          toadd = toadd.Substring(0, toadd.Length - 2); //开始这里没有处理好,层次关系显示不出来 :)

       }

       sdr.Close();

       conn.Close();

   }



//调用方法:在Page_Load里调用

   protected void Page_Load(object sender, EventArgs e)

   {

       this.keyword.Attributes.Add("onfocus","if( this.value=='key key key') {this.value='' };");

       if (!Page.IsPostBack)

       {

           this.getAllMenuData("-1");

       }

       this.DropDownList1.Items.Insert(0, new ListItem("Search All", "all"));

   }

    到这里所有东西都搞定啦,就这么简单。。。。。


标签: html php 数据库 .net c#

et_highlighter