【问题标题】:Get MenuItem in dynamically created Menu in asp.net在asp.net中动态创建的Menu中获取MenuItem
【发布时间】:2010-06-24 11:46:17
【问题描述】:

我在 asp.net 中使用菜单控件。我正在使用 xml 数据绑定创建菜单控件。
这是xml文件;

 <?xml version="1.0" encoding="utf-8" ?>
    <Items Text="">
      <Item Text="" ImgPath="./../images/home.gif"  Url="" Value="Home"   />
      <Item Text="" ImgPath="" Url="" Value="Time Entry" >
        <Item Text="" Value="Our Clients" ImgPath="./../images/oc.gif" Url="~/OurClients.aspx" />
      </Item>
      <Item Text="" ImgPath="" Value="Admin" Url="">
        <Item Text="" Value="About Us" ImgPath="./../images/AboutUs.gif" Url ="~/AboutUs.aspx" />
      </Item>
    </Items>


用于创建菜单,在 .aspx 页面中,我正在使用;

<asp:Menu ID="Menu1" runat="server" Orientation="Horizontal" DisappearAfter="10"
    Width="300px" DataSourceID="XmlDataSource1" StaticEnableDefaultPopOutImage="False" OnMenuItemClick="Menu1_MenuItemClick">
    <StaticMenuItemStyle CssClass="MenuItem" />
    <DynamicHoverStyle CssClass="SubMenuItemHover" />
    <DynamicMenuItemStyle CssClass="SubMenuItem" />
    <StaticHoverStyle CssClass="MenuItemHover" />
    <DataBindings>
        <asp:MenuItemBinding DataMember="Item" NavigateUrlField="Url" TextField="Text" ImageUrlField="ImgPath" ValueField="Value" />
    </DataBindings>
</asp:Menu>


现在,我正在尝试从此 Menu 控件中获取 MenuItem。为此,在页面加载时,我正在使用 ;

 MenuItem mn = Menu1.FindItem("Home");


但是,它返回 null。
请帮助我获得解决方案。
提前致谢。

【问题讨论】:

    标签: asp.net data-binding menu asp.net-2.0 menuitem


    【解决方案1】:

    为了从母版页代码文件外部访问您的母版页菜单,请在母版页代码文件中为您的菜单变量(在您的示例中为 Menu1)创建一个公共属性:

    Public ReadOnly Property MyMenu As Menu
        Get
            Return Menu1
        End Get
    End Property
    

    那么您将能够通过以下代码访问您的菜单,而无需使用子页面中的 findcontrol() 等搜索方法:

    DirectCast(Page.Master, <yourmaterpagename>).MyMenu
    

    在这种情况下,您再也不会遇到 null 问题,因为您返回的正是您请求的内容,除非您在初始化 Menu1 对象之前调用这行代码。

    【讨论】:

      【解决方案2】:

      当您以声明方式设置控件 DataSourceID(即在 aspx 中设置)时,该控件在页面的预渲染事件之前不会进行数据绑定。在调用 FindItem 方法之前尝试调用菜单的 databind 方法。

      您也可以等到触发 PreRenderComplete 事件并在那里运行您的代码,只要这还不算太晚。

      Page Life Cycle

      【讨论】:

      • 谢谢迈克。数据绑定确实有效。但是,我面临着新的问题。我的菜单控件位于母版页中,我正在从子页访问它。现在,子页面的加载事件在主页面之前被触发。所以它抛出“找不到对象引用”错误。我正在 Load 事件中从子页面访问菜单控件。
      • 抱歉,我想不出来什么。我需要查看与菜单相关的主/子页面的代码隐藏。我假设找到你正在做的菜单 page.master.findcontrol("menu1")?
      • 嗨,迈克,很抱歉给您带来不便。我在后面的代码中所做的是,我只是将 xml 文件名分配给 XMLDatasource 并提供 xpath。因此,findcontrol() 将返回菜单,但我试图访问 MenuItem,其 ID 在设计时未知。我假设它需要“文本”字段值。页面初始化后,在其他一些事件上 DataBind() 确实按照您的建议工作。但是,在页面加载时,它不起作用。回到办公室后,我将分享页面背后的代码。
      猜你喜欢
      • 2022-10-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-08-13
      • 1970-01-01
      • 2017-07-22
      • 1970-01-01
      • 2019-06-16
      相关资源
      最近更新 更多