Hallöle.
Ja, ich habe den Blogpost von Peter Bucher zu diesem Thema mehrfach gelesen aber anscheinend nicht verstanden.
Folgendes:
Ich habe eine verschachtelte Masterpage.
Also eine Masterpage, welche die grundlegenden Layoutgeschichten festlegt und darunter eine die bestimmte Inhalte darstellt.
In dieser gibt es eine Funktion die in Page_Load aufgerufen wird und die dynamisch Controls erzeugt, welche dann einem Panel (in der 2. Masterpage) zugewiesen werden.
Diese Funktion ist in einem reinen Codefile.
Es werden also die Controls erzeugt und in derselben Funktion ne Menge Javascript, welches per
ScriptManager.RegisterStartupScript ausgegeben wird.
So weit so gut.
Nur sollen die Javascriptfunktionen natürlich auf einige Controls zugreifen,welche ich dynamisch erstellt habe.
Da alles in derselben Funktion erzeugt wird, dachte ich , mache ich es ganz schlau und ich kann im Javascript die Controls locker per control.ClientID ansprechen...
da dies ja anscheinend die eindeutige, geschachtelte ClientID sein soll.
Pustekuchen.
Die ID's der Controls sind immer diesselben. Nämlich so wie ich sie beim dynamischen erstellen zuweise.
Das bringt mir natürlich nichts und im Javascript gibts Massig Fehler, da die Control IDs durch die Verschachtelungen gänzlich anders heißen.
Ich kann mir vorstellen, daß es für das Vergeben der eindeutigen IDs im Page_load zu früh ist, da in PreRender ja noch weitere folgen können und deshalb an der Stelle noch keine eindeutigen IDs bestehen, sondern erst wenn die Seite komplett durchgelaufen ist.
Ist das so?
Aber wie kann ich dann im JavaScript die Controls ansprechen?
Es muss alles in der Funktion erzeugt werden, da diese dann in der Anwendung dynamisch zuweisbar sein wird.
Hallo,
die ClientID sollte eigentlich das richtige sein, und Page_Load ist auch nicht zu früh.
Allerdings kann die ClientID erst bestimmt werden, wenn das Element (und alle übergeordneten Elemente) in die Seite eingefügt ist (nach dem Aufruf von Controls.Add(...)).
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Hm, so ein Käse aber auch.
Die Controls adde ich schlußendlich natürlich erst nach der Rückkehr aus der Funktion zu der Seite.
Wenn ich dann da das Javascript reinhaue, dann habe ich keinen Zugriff mehr auf die Controls, da ich diese ja in der Funktion erstelle.
Oder muss ich dann wieder alles durchsuchen....?
Hallo,
Du könntest Dir die betroffenen Controls beim Erstellen in einer Liste merken, für den späteren Zugriff...
Gruß, MarsStein
Non quia difficilia sunt, non audemus, sed quia non audemus, difficilia sunt! - Seneca
Ja, aber genau so nen Hickhack wollte ich vermeiden, aber wenns nicht anders geht...
Danke trotzem!
Salute schuppsl
Was genau hast du den am Artikel nicht verstanden?
Ich denke eher das dir der Realisierungsteil fehlt oder unvollständig erscheint.
Schau dir hierzu mal folgenden Post an, der mehrere Möglichkeiten enthält, um an die ID zu kommen:
Es gibt zwei wichtige Punkte:
Control test = new Control();
Label label = new Label();
test.Controls.Add(label);
sondern erst, wenn man sich komplett an die Page dranhängt, oder an ein Control das schon an der Page hängt.
this.Page.Controls.Add(test);
HTH
Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011
Salute schuppsl
Es gibt zwei wichtige Punkte:
- Das Control muss in die Hierarchie eingehängt werden (Am besten im OnInit, spätestens in OnLoad). Dabei ist zu beachten, das man wirklich am Root hängt, sowas nützt also nix:
......sondern erst, wenn man sich komplett an die Page dranhängt, oder an ein Control das schon an der Page hängt.
this.Page.Controls.Add(test);
Gruss Peter
Ja, soweit klar und genau darin besteht mein Problem!
Ich rufe die Render Funktion(welche meine Controls erzeugt) im Page_Load auf und müsste dann also im Page_PreRender die Controls suchen und dann die ID auslesen.
Aber wie kann ich diese finden, wenn ich nicht mal die ID kenne?
Zwickmühle.
Dann muss ich mal Deinen Link lesen...
leslesles...
Ok, den Namespace "tools" habe ich im Codefile (reines codefile) schonmal nicht...also geht Ansatz 1 nicht.
Hoi Schuppsl
Ja, soweit klar und genau darin besteht mein Problem!
Ich rufe die Render Funktion(welche meine Controls erzeugt) im Page_Load auf und müsste dann also im Page_PreRender die Controls suchen und dann die ID auslesen.
Aber wie kann ich diese finden, wenn ich nicht mal die ID kenne?
Zwickmühle.
Ich sehe dein Problem nicht wirklich.
Den Vorschlag von MarsStein ist kein Workaraound, sondern eine Lösung,
so wie ich das verstehe 😃
Ok, den Namespace "tools" habe ich im Codefile (reines codefile) schonmal nicht...also geht Ansatz 1 nicht.
Bitte ganz unten schauen, dort gibts das Beispielprojekt zum Download.
Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011
Hoi Schuppsl
Den Vorschlag von MarsStein ist kein Workaraound, sondern eine Lösung,
so wie ich das verstehe 😃Gruss Peter
Ist es nicht, da ich zu keinem Zeitpunkt die genaue ID erfahre.
Weder beim Erstellen, noch nach dem kompletten Rendern der Seite.
Das mag ja sein, daß es bei einer normalen Anwendung funktioniert, aber wenn die Controls in einer Codedatei (nicht Codebehind!) gerendert werden entsteht die endgültige ID erst wenn diese im Baum eingehängt werden.
Mir bleibt nichts anderes übrig, als alle Controls zu durchsuchen und mit der mir vergebenen ID zu vergleichen, bzw. ob die gefundene ID die entsprechende Zeichenfolge enthält.
Schlecht, denn ich wollte das modular machen und mit dieser Funktion eine Javascript Funktion mitrendern, was aber auch nicht möglich ist, da ich ja wieder die exakten IDs nicht kenne...
Hoi Schuppsl
Ok, den Namespace "tools" habe ich im Codefile (reines codefile) schonmal nicht...also geht Ansatz 1 nicht.
Bitte ganz unten schauen, dort gibts das Beispielprojekt zum Download.Gruss Peter
Wo ist das?
Hoi schuppsl
Das Beispielprojekt:
Ich sehe dein Problem jetzt. Hört sich jetzt zu einfach an, aber du musst dich an den Lifecycle halten, anders gehts nur mit Krücken.
Und das geht auch in fast jedem Fall. Im schlechtesten Fall musst du halt deine komplette Reihenfolge ein bisschen auf den Kopf stellen.
Wenn du das nicht magst, oder es einfach nicht gehen will, machs einfacher.
Nutze die Lösung von Wilco (http://www.wilcob.com/Wilco/News/AspNetIDOverride.aspx).
Nur hat der liebe Wilco den Content von der Seite genommen und angekündigt, er stelle das Zeugs langsam dann wieder hoch, was aber noch nicht passiert ist.
Darum würde ich vorschlagen du suchst einfach mal nach "ASP.NET ID Override".
Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011
Hoi schuppsl
Ich sehe dein Problem jetzt. Hört sich jetzt zu einfach an, aber du musst dich an den Lifecycle halten, anders gehts nur mit Krücken.
Darum würde ich vorschlagen du suchst einfach mal nach "ASP.NET ID Override".
Gruss Peter
Hallo Peter.
Ja das mit dem Lifecycle ist mir schon klar, nur versuche ich den mit besagten Krücken zu umgehen, was das Ganze sehr erschwert.
Dieser Lifecycle habe ich mir verinnerlicht und trotzdem bricht der mir so oft das Genick, weil ich es oft nicht Lifecycle-konform machen kann, und darum ständig nach anderen Lösungen suchen muss...
Danke mal wieder, werde mir dann die besagten Links mal genauer ansehen.
Grüße und gute Nacht
Salute schuppsl
Schau dir mal ASP.NET MVC an 😃.
Gruss Peter
--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011
Diese Aussage tut mir ja schon gut:
Postbacks fand ich immer etwas arg umständlich und das Problem “dynamisch hinzugefügte Controls” ist und bleibt irgendwie nicht ganz einfach zu lösen.
...bei mir sind fast alle Controls dynamisch.
Aber das hört sich doch gut an:
ASP.NET MVC ist eine Alternative zu den Webforms, welche eine bessere Kontrolle über den gerenderten HTML Code ermöglicht und durch das MVC Modell besser aufgeteilt und auch testbarer wird
Aber das Projekt läuft und ich kann unmöglich von vorne beginnen.....
EDIT: wie es scheint, ist das mit dynamischen Controls mit MVC auch nicht besser(was ich jetzt gelesen habe), also kann ichs lassen...
EDIT:
Ich habs nun versucht im PreRender die Controls zu suchen. Sie werden gefunden, aber nicht mit der UniqueID, sondern mit der ID die ich vergebe.
Bringt das was wen nich daraus ein Usercontrol mache und die Funktionalität komplett kapsle?
Alternativ muss ich per Javascript auf der fertigen Seite die Controls suchen und so dann ansprechen..
@Peter
ES GEHT!!!!!!!
DANK Deinem Post und dem Beispielprojekt hats nun endlich funktioniert...
DANKE DANKE DANKE!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
👍 👍 👍 👍 👍 👍 👍