Methode FindControl() returns null.
-
Hallo
Ich habe ein Problem bei meiner *.aspx- Seite. Ich erstelle die Webseite mit VisualWebDeveloper 2008 Express.
Ich habe folgendes Problem:
Ich habe ein DetailView- Element welches Detailiertere Daten zu einem vorher ausgewählten Datensatz anzeigt. Das funktioniert wunderbar. Nun kann man die angezeigten Daten auch abändern. Da gewisse Felder nicht beliebig abgeändert werden können, sondern nur aus vordefinierten Werten ausgewählt werden kann (Beispielsweise Autoren), habe ich im EditMode des DetailView- Elementes ein DropDownFeld eingefügt.
Nun möchte ich aber, dass dieses DropDownFeld nicht den ersten Autoren in der Liste ausgewählt hat, sondern möchte diesen selbst setzen.
Dazu will ich mit FindControlRecursive() ein Control auf dieses DropDownFeld erhalten. Leider gibt die Funktion stets null zurück.Hier der Code:
//AutorenFeld in dvDetailView: <asp:TemplateField HeaderText="Autor"> <EditItemTemplate> <asp:DropDownList ID="ddEditAuthor" runat="server" DataSourceID="SqlDataSource1" DataTextField="FullName" DataValueField="ID"> </asp:DropDownList> </EditItemTemplate> <ItemTemplate> <asp:Label ID="lblAuthor" runat="server" Text = '<%#bind("Autor") %>' ></asp:Label> </ItemTemplate> </asp:TemplateField> //Je nach Modus (ReadOnly, Write) ändert sich das Feld von einem Label in ein Dropdown. Die jeweiligen IDs sind ersichtlich.
//Methode FindControlRecursive. Erstellt da die normale FindControl()- Methode nur eine Ebene der Seite durchsucht. Die nested Elements aber übersieht: public static Control FindControlRecursive(Control Root, string ID) { if (Root.ID == ID) { return Root; } foreach (Control Ctrl in Root.Controls) { Control FoundCtrl = FindControlRecursive(Ctrl, ID); if (FoundCtrl != null) { return FoundCtrl; } } return null; }
//Funktionsaufruf. Hier erhalte ich null zurück :¨( DropDownList ddEditAuthor = (DropDownList)(FindControlRecursive(dvDetailView, "ddEditAuthor"));
Fehler im Code? Oder ist es gar nicht möglich aus einem Template- Feld ein Control zu "extrahieren"? Hab bei Google keine schlauen Suchergebnisse finden können.
Eure Lösungsansätze?
So long,
MuuhKuh
-
Hallo
Konnte das Problem lösen. Für Leute mit dem gleichen Problem:
Control holen:
DropDownList ddEditAuthor = (DropDownList)(dvDetailView.FindControl("ddEditAuthor"));
Auf Elemente des DropDowns zugreiffen:
ddEditAuthor.Items.FindByText(Author).Selected = true;
Dazu muss natürlich im Formular das TextAttribut gesetzt werden:
<asp:Label ID="lblAuthor" runat="server" Text ='<%#bind("Autor") %>'></asp:Label>