2 votes

Portée du contrôle dans le Repeater, avec et sans UpdatePanel

Pourquoi le texte suivant me donne-t-il une erreur de compilation pour la ligne B (Label2, en dehors de l'UpdatePanel) mais pas pour la ligne A (Label1, à l'intérieur de l'UpdatePanel) ? Je me serais attendu à ce que les deux lignes donnent une erreur puisque les deux contrôles sont dans le même Repeater et ne devraient donc pas être directement accessibles en dehors du Repeater, puisqu'il n'y a pas d'instance unique.

<script runat="server">
    protected void Page_Load(object sender, EventArgs e)
    {
        Label1.Text = Label1.ClientID;  // Line A - compiles fine
        Label2.Text = Label2.ClientID;  // Line B - "The name 'Label2' does not exist in the current context"
    }
</script>

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Untitled Page</title>
</head>
<body>
    <form id="form1" runat="server">
        <div>
            <asp:ScriptManager ID="ScriptManager1" runat="server" />
            <asp:Repeater runat="server" ID="Repeater1">
                <ItemTemplate>
                    <asp:UpdatePanel runat="server" ID="UpdatePanel1">
                        <ContentTemplate>
                            <asp:Label ID="Label1" runat="server" Text="Label1" />
                        </ContentTemplate>
                    </asp:UpdatePanel>
                    <asp:Label ID="Label2" runat="server" Text="Label2" />
                </ItemTemplate>
            </asp:Repeater>
        </div>
    </form>
</body>
</html>

1voto

Spencer Ruport Points 24589

Je parie que si vous commentez la ligne B, vous obtiendrez une erreur d'exécution à l'exécution. Label1 va être une référence nulle.

Lorsque vous créez des contrôles dans la page ASPX, Visual Studio essaie de vous aider en ajoutant les contrôles au code situé derrière dans le fichier du concepteur qui étend la classe de la page. Dans ce cas, il en ajoute un alors qu'il ne devrait pas le faire.

La réponse courte est que c'est un bug. Vous devriez le soumettre mais il ne devrait pas être un problème de blocage.

0voto

Mcbeev Points 1099

La vraie question est de savoir pourquoi vous créez plusieurs panneaux de mise à jour dans un répéteur ? Mettez-en un en dehors du répétiteur et c'est bon. Ou si vous voulez juste rafraîchir du texte, n'utilisez pas de panneau de mise à jour, utilisez un rappel avec un script côté client pour définir l'élément dom. Regardez ceci http://encosia.com/2007/07/11/why-aspnet-ajax-updatepanels-are-dangerous/

0voto

Dave Ward Points 36006

Aucun des deux n'est correct de toute façon. Vous ne devriez pas essayer de référencer directement un contrôle qui est contenu dans l'ItemTemplate.

Si vous souhaitez modifier ces étiquettes au moment de l'exécution, vous devez utiliser OnItemDataBound et FindControl. Pour "trouver" l'étiquette dans l'UpdatePanel, vous devez utiliser UpdatePanel.ContentTemplateContainer.FindControl().

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X