2 Stimmen

Kontrollbereich im Repeater, mit und ohne UpdatePanel

Warum bekomme ich im Folgenden einen Kompilierungsfehler für Zeile B (Label2, außerhalb von UpdatePanel), aber nicht für Zeile A (Label1, innerhalb von UpdatePanel)? Ich hätte erwartet, dass in beiden Zeilen ein Fehler auftritt, da beide Steuerelemente innerhalb desselben Repeaters liegen und daher außerhalb des Repeaters nicht direkt zugänglich sein sollten, da es keine eindeutige Instanz gibt.

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

Ich wette, wenn Sie Zeile B auskommentieren, erhalten Sie bei der Ausführung einen Laufzeitfehler. Label1 wird eine Null-Referenz sein.

Wenn Sie Steuerelemente in der ASPX-Seite erstellen, versucht Visual Studio, Ihnen zu helfen, indem es die Steuerelemente zum Code in der Designerdatei hinzufügt, die die Klasse für die Seite erweitert. In diesem Fall fügt es eines hinzu, wenn es nicht sein sollte.

Die kurze Antwort lautet: Es ist ein Fehler. Sie sollten ihn einreichen, aber es sollte kein Blockierungsproblem sein.

0voto

Mcbeev Punkte 1454

Die eigentliche Frage ist, warum Sie mehrere Aktualisierungsfelder in einem Repeater erstellen? Legen Sie eine außerhalb des Repeaters und nennen es gut. Oder wenn Sie nur etwas Text aktualisieren wollen nicht ein Update-Panel verwenden, verwenden Sie einen Rückruf mit einigen Client-Side-Skript, um das Dom-Element festgelegt. Schauen Sie sich dies http://encosia.com/2007/07/11/why-aspnet-ajax-updatepanels-are-dangerous/

0voto

Dave Ward Punkte 58382

Beides ist sowieso nicht richtig. Sie sollten nicht versuchen, direkt auf ein Steuerelement zu verweisen, das im ItemTemplate enthalten ist.

Wenn Sie diese Bezeichnungen zur Laufzeit ändern möchten, sollten Sie OnItemDataBound und FindControl verwenden. Um das Label im UpdatePanel zu "finden", müssen Sie UpdatePanel.ContentTemplateContainer.FindControl() verwenden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X