陋室铭
永远也不要停下学习的脚步(大道至简至易)

 以前做菜单都是取出数据后直接用菜单节点构建菜单,今天发现原来可以换为xml为数据源,做了一个简单的实验了一下,发现比直接建菜单舒服些,写出来看看

注:其中SystemMenuInfo为实体类,我就不写出来了,

 看来菜单还是依赖XML结构才是正道

 数据表简单结构

SystemMenuID SystemMenuName ParentID Url
1 黑龙江省 0 #
2 哈尔滨市 1 #
3 五常市 2 #
4 辽宁省 0 #
5 大连市 4 #

public partial class StartPage : System.Web.UI.Page
{
    SystemMenu sm = new SystemMenu();
    IList<SystemMenuInfo> sms;
    public void RecursionXml(SystemMenuInfo smi, XmlDocument xd, XmlElement xe)
    {
        XmlElement menuItem = xd.CreateElement("menuItem");
        menuItem.SetAttribute("SystemMenuID", smi.SystemMenuID);
        menuItem.SetAttribute("SystemMenuName", smi.SystemMenuName);
        menuItem.SetAttribute("ParentID", smi.ParentID);

        menuItem.SetAttribute("Url", smi.Url);
        xe.AppendChild(menuItem);
        foreach (SystemMenuInfo smiChild in sms)
        {

            if (smiChild.ParentID == smi.SystemMenuID)
            {
                RecursionXml(smiChild, xd, menuItem);
            }
        }
    }
    public string CreateMenu()
    {
        sms = sm.GetSystemMenus();
        XmlDocument xd = new XmlDocument();
        XmlNode menu = xd.CreateElement("menu");
        xd.AppendChild(menu);

        foreach (SystemMenuInfo smi in sms)
        {
            if (smi.ParentID == "0")
            {
                RecursionXml(smi, xd, (XmlElement)menu);
            }
        }
        return xd.OuterXml;

    }
    public void BindMenu()
    {

        //XmlSource.DataFile = "*.xml";当然如果你依赖与实际的xml文件也是可以的
        XmlSource.Data = CreateMenu();
        XmlSource.DataBind();
        XmlSource.XPath = "menu/menuItem";
        TreeView1.DataSource = XmlSource;
        TreeView1.DataBind();
        Menu2.DataSource = XmlSource;
        Menu2.DataBind();
    }
    protected void Page_Load(object sender, EventArgs e)
    {
        BindMenu();
    }
}

 

 

        <asp:Menu ID="Menu2" runat="server" Orientation="Horizontal" StaticEnableDefaultPopOutImage="false">
            <DataBindings>
                <asp:MenuItemBinding ValueField="SystemMenuID" TextField="SystemMenuName"  NavigateUrlField="Url" />
            </DataBindings>
        </asp:Menu>
        <asp:XmlDataSource runat="server" ID="XmlSource" />
        <asp:TreeView ID="TreeView1" runat="server">
            <DataBindings>
                <asp:TreeNodeBinding ValueField="SystemMenuID" TextField="SystemMenuName"  NavigateUrlField="Url" />
            </DataBindings>
        </asp:TreeView>

 

然后 你就可以看效果了:)

 

 

 

public class SystemMenu
{
    public IList<SystemMenuInfo> GetSystemMenus()
    {
        IList<SystemMenuInfo> ss = new List<SystemMenuInfo>();

 

        SystemMenuInfo s1 = new SystemMenuInfo();
        s1.SystemMenuID = "1";
        s1.SystemMenuName = "黑龙江省";
        s1.ParentID = "0";
        s1.Url = "#";

        SystemMenuInfo s2 = new SystemMenuInfo();
        s2.SystemMenuID = "2";
        s2.SystemMenuName = "哈尔滨市";
        s2.ParentID = "1";
        s2.Url = "#";

        SystemMenuInfo s3 = new SystemMenuInfo();
        s3.SystemMenuID = "3";
        s3.SystemMenuName = "五常市";
        s3.ParentID = "2";
        s3.Url = "#";

        SystemMenuInfo s4 = new SystemMenuInfo();
        s4.SystemMenuID = "4";
        s4.SystemMenuName = "辽宁省";
        s4.ParentID = "0";
        s4.Url = "#";

        SystemMenuInfo s5 = new SystemMenuInfo();
        s5.SystemMenuID = "5";
        s5.SystemMenuName = "大连市";
        s5.ParentID = "4";
        s5.Url = "#";

        ss.Add(s1);
        ss.Add(s2);
        ss.Add(s3);
        ss.Add(s4);
        ss.Add(s5);
        return ss;
    }
}

public class SystemMenuInfo
{
    public string SystemMenuID;
    public string SystemMenuName;
    public string ParentID;
    public string Url;
}

 

posted on 2009-01-08 23:10  宏宇  阅读(1379)  评论(0编辑  收藏  举报