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,就可以解决了.