追求新生活 名字2008

活着的意义

c#两级菜单menu的动态实现

之前,上年了,我写过一个系统,测试用的,感觉做动态menu时候很别扭,难实现,扩展也不好,关键有两点:

1、数据库(表)的设计没有设计好

2、程序实现起来不够灵活,导致扩展也难。

于是,我4月决定一定要解决该问题,重写了该模块。

终于实现如下,还很简单哦。

1、在页面上拖一个Menu控件,等待动态调用。  

2、数据库对应的mssql表:注意id列要标识:是 标识种子:1  标识增量:1才会自动递增的哦。

看图表示:

 

3、代码实现,很简单哦

protected void Page_Load(object sender, EventArgs e)
    {

if (!IsPostBack)
        {
            SqlConnection conn = db.Acce_Conn();
            conn.Open();
           string sql = "select * from site_inf";
            SqlCommand cmd = new SqlCommand(sql, conn);//定义为可执行命令的对象
            SqlDataReader reader = cmd.ExecuteReader();
            if (reader.Read ())//可以忽略红色
            {
                site_name = reader["site_name"].ToString();//获得站点原来设置好的信息site_inf为站点设置信息表
                site_logo = reader["site_logo"].ToString();
                site_picture = reader["site_picture"].ToString();
                school_pic_type = site_picture.Substring(site_picture.LastIndexOf(".") + 1);//获得图片类型是jpg or swf
            }
            reader.Close();
             conn.Close();

      
            MenuItem[] mi = new MenuItem[10];//一级菜单
            MenuItem[] mi_child = new MenuItem[30];
            DataTable get_site_inf = db.accessGetDataSet("select * from top_menu where class_id=0").Tables[0];//得到表的一级菜单数据集
            DataTable get_site_inf_child = db.accessGetDataSet("select * from top_menu where class_id=1").Tables[0];//得到表的二级菜单数据集
            for (int i = 0; i <= get_site_inf.Rows .Count-1 ; i++)//循环表得到菜单
            {
                mi[i] = new MenuItem();
                mi[i].Text = get_site_inf.Rows[i]["menu_name"].ToString();//得到一级菜单
                Menu1.Items.Add(mi[i]);
                mi[i].NavigateUrl = get_site_inf.Rows [i]["menu_link"].ToString();             

            }
            for (int j = 0; j <= get_site_inf_child.Rows.Count - 1; j++)//得到二级菜单
            {
                mi_child[j] = new MenuItem();
                if (get_site_inf_child.Rows[j]["menu_name"].ToString() != "")//如果数据库中不为空值,则...
                {
                    mi_child[j].Text = get_site_inf_child.Rows[j]["menu_name"].ToString();//表中的第二行开始,得到二级以下
                    int i = System.Convert.ToInt32(get_site_inf_child.Rows[j]["father_id"].ToString());
                    mi[i - 1].ChildItems.Add(mi_child[j]);//为什么要i-1, 因为father_id对应的id要一致,表是从0开始计算的,所以,i-1才对应真实表的第一行
                  if (get_site_inf_child.Rows[j]["menu_link"].ToString()!="") 
                 {
                     mi_child[j].NavigateUrl = get_site_inf_child.Rows[j]["menu_link"].ToString();
                 }
                 else
                {
                   mi_child[j].NavigateUrl = "news_list.aspx?inf_type=" + mi_child[j].Text;//如果没有链接,则导航到指定页面
                }
               }
            }

 4、经过测试,调试,是没有问题的。看效果,还可以链接好的哦。不过,在录入页面,要设置好,到底是一级菜单还是二级别菜单,导航到那里才行。看效果

5、说明:db是一个写好的类,里面有不少函数和通用的可调用的方法。

好好想想。好好想想,三级菜单是否也可以这样实现呢?呵呵!!!!!!!!!!!!

6.如果想manu菜单不出现小箭头,可以

staticEnableDefaultPopImageOut属性设置为False,就可以解决了.

 

posted on 2011-04-08 10:46  pyman  阅读(6269)  评论(2编辑  收藏  举报

导航