以前做菜单都是取出数据后直接用菜单节点构建菜单,今天发现原来可以换为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;

}