2010-06-24 9 views
0

J'utilise le contrôle Menu dans asp.net. Je crée le contrôle de menu en utilisant la liaison de données xml.
Voici le fichier xml;
Obtenir MenuItem dans un menu créé dynamiquement dans 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> 


Pour créer le menu, à la page .aspx, je me sers;

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


Maintenant, je suis en train de se MenuItem de ce contrôle Menu. Pour cela, au chargement de la page, j'utilise;

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


Mais, il est de retour nul.
Aidez-moi s'il vous plaît à obtenir la solution.
Merci à l'avance.

Répondre

1

Lorsque vous définissez un contrôle DataSourceID de contrôles (c'est-à-dire que vous le définissez dans l'aspx), le contrôle n'est pas databound jusqu'à l'événement prerender de la page. Essayez d'appeler la méthode databind du menu avant d'appeler sa méthode FindItem.

Vous pouvez également attendre que l'événement PreRenderComplete soit déclenché et y exécuter votre code, à condition que ce ne soit pas trop tard.

Page Life Cycle

+0

Merci mike. DataBinding a fonctionné. Mais, je suis confronté à un nouveau problème. Mon contrôle Menu est dans la page maître et j'y accède à partir d'une page enfant. Maintenant, l'événement de chargement de la page enfant est déclenché avant le maître. de sorte qu'il lance l'erreur "Object referrence not found". J'accède au contrôle Menu à partir de la page enfant dans l'événement Load. –

+0

Désolé, mais je ne peux pas penser à quelque chose de haut de ma tête. Je devrais voir le code derrière les pages maître/enfant liées au menu. Je suppose pour trouver le menu que vous faites un page.master.findcontrol ("menu1")? –

+0

Hey Mike, désolé pour le dérangement. Ce que je fais dans le code derrière, c'est que j'affecte juste le nom de fichier xml à XMLDatasource et fournit le xpath. Ainsi, findcontrol() retournera le menu, mais j'essaie d'accéder à MenuItem, dont l'ID n'est pas connu au moment du design. Je suppose qu'il nécessite une valeur de champ "Texte". Après l'initialisation de la page, sur un autre événement DataBind() a fonctionné comme suggéré par vous. Mais, au chargement de la page, cela ne fonctionne pas. Je vais partager le code derrière la page une fois que je serai de retour au bureau. –

3

Pour accesing votre menu masterpage de l'extérieur du fichier de code page maître créer une propriété publique pour votre variable menu (Menu1 dans votre exemple) dans votre fichier de code page maître:

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

puis vous serez en mesure d'accéder à votre menu sans utiliser les méthodes de recherche comme findcontrol() à partir des pages enfants en utilisant le code suivant:

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

Dans ce cas, vous n'obtiendrez plus jamais de problèmes Null parce que vous retournez exactement ce que vous demandez, sauf lorsque vous appelez cette ligne de code avant l'initialisation de l'objet Menu1.

Questions connexes