Montag, 13. April 2015

Event von Web-Usercontrol als Repeater-Element auslösen

Wenn man ein Usercontrol als Listen-Element in einem Repeater einsetzt, will man wahrscheinlich auf Klicks innerhalb des Controls im Repeater reagieren. Eigentlich kein Problem, man muss nur im selbstgebauten Control ein Public Event definieren und beim passenden Klick das Event auslösen. Außerdem muss das Event natürlich im Repeater registriert werden, um darauf zu reagieren.

In VB .NET sähe das so aus:

Z.B. im Usercontrol:

Public Event Changed(sender As Objecte As EventArgs)

Dann in der Klick-Routine:

RaiseEvent Changed(MeNew EventArgs)

Und im Repeater wird dieses Event so registriert:

AddHandler <Usercontrol>.ChangedAddressOf <Subroutine>

Soweit so gut.

Die Frage ist allerdings, wann registriere ich den Eventhandler? Ich habe das zunächst innerhalb des ItemDataBound-Ereignisses im Repeater gemacht. Was mir deshalb logisch erschien, weil zu dem Zeitpunkt das Usercontrol vorhanden sein muss. Doch, wie ich nach etlichen Versuchen feststellte, es wird dann nie ausgelöst, bzw. es wird im Usercontrol ausgelöst aber kommt nie im Repeater an. Echt frustrierend.

Die Lösung ist, wie immer einfach, wenn man's weiß: das Event muss unbedingt im ItemCreated-Ereignisses des Repeaters registriert werden! Denn dies Event wird bei jedem Aufruf der Seite, auch bei Postbacks aufgerufen!

Sonntag, 5. April 2015

Stylesheet in ASP. NET Mastersite funktioniert nur mit runat=“server“ Attribut!

Hat mich eine gute Stunde Websuche gekostet, bis ich herausgefunden hatte, warum bei allen Pages CSS nicht funktionierte, obwohl der Stylesheet-Link ordnungsgemäß im HEAD-Tag der Masterseite stand. Diesen Link trägt Microsoft bzw. Visual Studio selbst ein, sobald man der Seite einen Stil zuordnet. Das sieht dann so aus:

   <link href="../<Ordner>/<style>.css" rel="stylesheet" type="text/css" />

Scheinbar alles okay, funktioniert auch super im Designmodus der Masterpage. Aber eben nicht auf den zugeordneten Pages. Ich hab es dann damit versucht, den Style-Link auf jeder Page zusätzlich einzutragen – ohne Erfolg. Schließlich hatte ich die Lösung im Netz gefunden (nachdem alle möglichen Vorschläge nicht funktionierten, z.B. den DOCTYPE zu ändern, oder die css-Datei im Root-Ordner zu speichern). Es fehlt lediglich ein runat-Attribut und der Pfad muss mit der Tilde ‚~' beginnen (das media-Attribut ist optional). Also:

   <link href="~/<Ordner>/<style>.css" rel="stylesheet" type="text/css" runat="server" media="screen" />

Und schon läuft es wie geschmiert. – Allerdings nicht bei UserControls. Da muss ich noch eine Lösung finden, wie dort das CSS auch im Design angezeigt wird.