2009-05-22 17 views
1

Ich spiele mit einem Formular mit einem Repeater, an dem ich gearbeitet habe, und ich versuche derzeit, einen Event-Handler zu schreiben, der den Wert bestimmter Steuerelemente in einem Repeater erhalten wird nachdem das Formular mit dem Repeater eingereicht wurde. Ich nahm an, dass etwas Ähnliches wie dies funktionieren würde, wenn ich das Etikett von der ersten Verstärkerpunkt, dann den Text davon auf den Text eines anderen Labels abrufen wollte:Benötigen Sie Hilfe mit FindControl-Funktion

protected void SubmitMessage_Click(object sender, EventArgs e) 
{ 
    Label MyLabel = (Label)MyRepeater.Items[0].FindControl("MessageID"); 
    MyLabel2.Text = MyLabel.Text; 
} 

Mit diesem aber es scheint, dass MyLabel .Text ist leer. Beim Testen, ob MyLabel nach der Einstellung Null ist, ist das Ergebnis falsch, also versuche ich, einen Grund herauszufinden, warum MyLabel nicht den gleichen Inhalt des Repeater-Elements hat, auf das ich es einstellen möchte. MyLabel2 ist bereits an der Spitze der Klasse deklariert. Danke im Voraus.

BEARBEITEN: Der Text der Beschriftung in der ASPX-Datei wird nicht innerhalb des Textattributs, sondern im Container der Beschriftung selbst datengebunden. Ich werde die andere Methode am Dienstagmorgen versuchen, sobald ich wieder in meinen Code komme, auf Benjamins Vorschlag hin.

+0

Lush, können Sie einen Ausschnitt Ihres HTML/ASPX veröffentlichen, um uns zu zeigen, wie Sie das erzeugen. –

+0

tatsächlich, wenn Sie entweder die URL oder die rohe HTML-Ausgabe veröffentlichen können, kann ich viel erzählen - Ich benutze häufig FireBug, um zu sehen, wie die Informationen auf dem Bildschirm ausgegeben wurden. zwischen diesem und quickwatch ist es einfach, so ziemlich alles zu finden –

+0

Die Ausgabe HTML ist nur eine leere Spannweite. –

Antwort

2

Es kommt darauf an, wie Sie binden die Daten auf Ihrem Etikett am Repeater.

<asp:Repeater ID="Repeater1" runat="server"> 

<ItemTemplate> 

    <asp:Label ID="Label1" runat="server"><%# DataBinder.Eval(Container.DataItem,"CustomerName") %></asp:Label> 

    <asp:Label ID="Label2" runat="server" Text=<%# DataBinder.Eval(Container.DataItem,"Country") %>></asp:Label> 

    </ItemTemplate> 
</asp:Repeater> 

Label1 das Textattribut nicht gesetzt ist, und die Daten auf der Client-Seite wird in dem Körper des Etiketts an das Steuerelement gebunden. wird in das span-Tag geschrieben, nachdem das Label auf der Seite gerendert wurde und niemals direkt an das Label-Steuerelement gebunden ist. Dies geschieht nur, wenn Sie in Zeile Skript im Textkörper der Beschriftung verwenden, wenn es nur Text war, überschreibt der Textkörper der Beschriftung immer den Textattributwert einer Beschriftung.

Für Label2 das Textattribut wirdauf dem Server so die Bindung stattfindet, festgelegt wird zwingt sie den Inline-Skript zu bewerten, bevor es das Label beendet Rendering und ist damit zugänglich durch Ihre andere Kontrollen.

Ohne Ihren Repeater tatsächlich zu sehen, vermute ich, dass Ihre Daten so gebunden werden.

Hier ist ein Testcode, um Ihnen diesen Fall zu beweisen.

protected void Page_Load(object sender, EventArgs e) 
    { 
     if (!Page.IsPostBack) 
     { 
      DataSet ds = new DataSet(); 
      DataTable dt = ds.Tables.Add("Customer"); 
      dt.Columns.Add("CustomerName", Type.GetType("System.String")); 
      dt.Columns.Add("Country", Type.GetType("System.String")); 

      DataRow dr = dt.NewRow(); 
      dr[0] = "Testcustomer1"; 
      dr[1] = "USA"; 
      dt.Rows.Add(dr); 

      dr = dt.NewRow(); 
      dr[0] = "Testcustomer2"; 
      dr[1] = "UK"; 
      dt.Rows.Add(dr); 

      dr = dt.NewRow(); 
      dr[0] = "Testcustomer3"; 
      dr[1] = "GERMANY"; 
      dt.Rows.Add(dr); 

      dr = dt.NewRow(); 
      dr[0] = "Testcustomer4"; 
      dr[1] = "FRANCE"; 
      dt.Rows.Add(dr); 

      //Bind the data to the Repeater 
      Repeater1.DataSource = ds; 
      Repeater1.DataMember = "Customer"; 
      Repeater1.DataBind(); 
     } 

    } 

    protected void SubmitMessage_Click(object sender, EventArgs e) 
    { 
     Label MyLabel = (Label)Repeater1.Items[0].FindControl("Label1"); 
     Label MyLabel2 = (Label)Repeater1.Items[0].FindControl("Label2"); 
     //Empty String Text was never set server side 
     Label3.Text = MyLabel.Text; 
     //String is found because Text was set 
     Label4.Text = MyLabel2.Text; 
    } 

plug it in und ein paar zusätzliche Etiketten hinzufügen und Sie werden sehen Label4 die Daten die Sie suchen hat, während Label3 leer ist.

+0

DataBinding wäre schon geschehen, da es nach dem Page_Load (oder anderem) und vor dem nächsten Pageload (oder anderem) ... ist? –

+0

Die Daten befinden sich im Repeater und werden auf der Seite angezeigt, aber wenn das Attribut Label Text nicht explizit festgelegt ist und die Daten im Textkörper platziert werden, ist das Label selbst nie wirklich gebunden. Etiketten sollen nicht so eingestellt werden und in diesem Fall können Sie sehen warum. – benjamin

+0

Aber wie erfolgt das Einstellen der Daten innerhalb des Labels (nicht innerhalb des Textattributs) clientseitig statt serverseitig? Bedeutet das nicht, dass JavaScript oder Ähnliches für den Browser generiert werden müsste? Ich mache keine Behauptungen, da ich keinen Code vor mir habe, aber wie ich es verstehe, werden alle Inline-Skripte serverseitig verarbeitet. –

0

Ich bin mir nicht sicher, aber wenn das Ereignis ausgeführt wird, wurde der Repeater möglicherweise noch nicht neu gefüllt. Da der Aufruf der Methode ist "ByVal" (VB sprechen) und nicht ByRef der Wert möglicherweise übergeben, aber das ursprüngliche Objekt ist noch nicht bevölkert ... Nur ein Gedanke ...

+0

Late Night und ein paar Bier so verurteile mich nicht zu schwer ...;) –

Verwandte Themen