2010-06-24 2 views
0

Я использую управление меню в asp.net. Я создаю управление меню, используя привязку данных xml.
Это xml-файл;
Получить MenuItem в динамически созданное меню в asp.net

<?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> 


Теперь я пытаюсь получить MenuItem из этого элемента управления меню. Для этого, при загрузке страницы, я использую;

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


Но, возвращается нуль.
Пожалуйста, помогите мне найти решение.
Спасибо заранее.

ответ

1

Когда вы декларативно устанавливаете элементы управления DataSourceID (т. Е. Устанавливаете его в aspx), элемент управления не привязывается к базе данных до события prerender страницы. Попробуйте вызвать метод привязки меню, прежде чем вы вызовете его метод FindItem.

Вы также можете дождаться события PreRenderComplete и запустить свой код там, пока это не слишком поздно.

Page Life Cycle

+0

Спасибо mike. DataBinding действительно сработало. Но я столкнулся с новой проблемой. Управление моим меню находится на главной странице, и я обращаюсь к нему с дочерней страницы. Теперь событие загрузки дочерней страницы запускается перед мастером. поэтому он бросает ошибку «Ошибка ссылки на объект». Я получаю доступ к элементу управления меню с дочерней страницы в событии Load. –

+0

Извините, но я ничего не могу придумать с головы. Мне нужно будет увидеть код, который находится на главном/дочернем страницах, связанных с меню. Я предполагаю, что вы найдете меню, в котором вы делаете page.master.findcontrol («menu1»)? –

+0

Эй, Майк, извините за неудобства. То, что я делаю в коде позади, я просто назначаю XML-имя файла XMLDatasource и предоставляя xpath. Итак, findcontrol() вернет меню, но я пытаюсь получить доступ к MenuItem, чей идентификатор неизвестен во время разработки. Я предполагаю, что для этого требуется значение поля «Текст». После инициализации страницы, в каком-то другом событии DataBind() работал, как было предложено вами. Но при загрузке страницы он не работает. Я пошлю код за страницей, как только вернусь в офис. –

3

Для экранным меню вашего Masterpage из вне файла кода мастера страницы создать открытое свойство для переменного меню (menu1 в вашем примере) в вашем главном файле страница коды:

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

затем вы сможете получить доступ к своему меню, не используя методы поиска, такие как findcontrol(), с дочерних страниц, используя следующий код:

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

в этом случае вы больше не сталкиваетесь с нулевыми проблемами, потому что возвращаете именно то, что вы запрашиваете, за исключением случаев, когда вы вызываете эту строку кода до инициализации объекта Menu1.

Смежные вопросы