Laden...

Forenbeiträge von Rodney Ingesamt 341 Beiträge

04.09.2010 - 17:24 Uhr

Danke für die Antwort, aber wie ich merke, hab ich einen wichtigen Teil vergessen 😉
Ich möchte die ID deshalb selbst festlegen, weil ich aus JS heraus darauf zugreifen möchte. Deswegen sollte die ID ein bestimmtes Format haben...

Viele Grüße,
Rodney

02.09.2010 - 18:20 Uhr

Hallo zusammen,

ich überlege gerade, wie es möglich ist, asp.net Controls in einem ItemTemplate eines Repeater-Controls zu verwenden:

Alle Controls brauchen ja eine eindeutige ID, in der aspx-Datei kann ich aber, soweit ich sehe, nicht dynamisch die ID festlegen. Ich habe versucht so etwas wie txtName_ + ItemIndex zu verwenden - das funktioniert (kompiliert) nicht.

Wie löst man das normalerweise? Ich finde leider keine Beispiele.

Meine einzige Idee:
Im ItemDataBound-Event auf die einzelnen Controls zugreifen und dann eine neue ID festlegen.

Ich würde mich über Tipps oder Anregungen sehr freuen - das Problem muss es doch öfter geben 😉

Viele Grüße,
Rodney

29.06.2010 - 20:34 Uhr

Hallo zusammen,

ich probiere gerade damit herum, eine DropDownList über eine XmlDataSource zu befüllen und später auch auf die Attribute zuzugreifen:


<asp:DropDownList ID="drpCategory" runat="server" DataTextField="text" DataValueField="id" />

Ich habe folgende XML-Struktur


<data>
    <buchtyp>
        <typ id="TestID" text="Test Text" prize="2900" />
    </buchtyp>
</data>

im Code-Behind mache ich dann:


var source = new XmlDataSource
                             {
                                 DataFile = "~/data.xml",
                                 XPath = "/data/buchtyp/typ",
                                 EnableCaching = true
                             };
drpCategory.DataSource = source;
drpCategory.DataBind();

Das klappt auch insofern, als dass Text und Value richtig gesetzt werden.
Nur wie greife ich auf die weiteren Attribute (hier nur "prize") zu?

Die Attribute Collection ist immer leer:


var item =  drpCategory.SelectedItem;
var text = item.Text; // richtig gesetzt
var value = item.Value; // richtig gesetzt
var collection = item.Attributes; // leere Liste!

Habe ich etwas übersehen, oder funktioniert das einfach nicht?

Viele Grüße,
Rodney

03.12.2009 - 23:26 Uhr

Hallo zusammen,

ich entwickele momentan ein Projekt dass verschiedene UserControls in unterschiedlichen Assemblies definiert. Für die Verknüpfung dieser Controls verwende ich das Inversion of Control Pattern.

Bspw. möchte ich in Assembly A ein UserControl anzeigen, dass in Assembly B definiert wird. Dann mache ich in Assembly A etwas wie:


UserControl c = IoC.Get<UserControl>();
Form.Controls.Add(c);

Zur Laufzeit klappt dies alles wunderbar.

Nun würde ich mir das UserControl natürlich auch schon gerne zur Design-Zeit anzeigen lassen. Daher meine eigentliche Frage: Ist der Visual Studio (2008) Designer so mächtig, dass er alle Abhängigkeiten entsprechend auflösen und sich so ein Objekt über den IoC holen kann?
Dazu müsste er intern mehrere Assemblies ausführen, da sich Assembly B ja normalerweise erst zur Laufzeit am IoC mit seinen Objekten anmeldet.

Wenn ich es straight-forward so mache, dass ich in der Designer Datei bei der Instantierung des UserControls den IoC anspreche, bekomme ich eine Designer-Fehlermeldung, dass er die entsprechende generische IoC<>.Get() Methode nicht findet.

Ziel ist wie geagt, dass ich das UserControl während des Designen der Form schon bereits vollständig geladen sehe.

Ich bin für jeden Gedankenanstoß dankbar!

15.11.2009 - 19:08 Uhr

Hallo zusammen,

ich habe ein Problem mit der BindingList-Klasse in Verbindung mit nicht-instanzierbaren Elementen als Liste.

Ausgangspunkt ist eine generische Liste vom Typ: IList<IMyInterface>. Diese möchte ich über eine BindingList<IMyInterface> so an ein GridView binden, dass der User beliebig Spalten ändern/löschen hinzufügen kann. Bspw. soll immer eine leere zusätzliche Zeile ganz unten erscheinen.

Bis auf das hinzufügen funktioniert das auch sofort, beim Hinzufügen ist natürlich klar, dass das nicht so ohne weiteres geht, weil die Liste nicht weiß mit welchem konkreten Typ sie ein IMyInterface-Objekt instanzieren soll.

Ich habe nun versucht von einer BindingList zu erben und ein entsprechendes Event zu überschreiben, da ich bei Programmablauf über Dependent Injection weiß, welcher Typ zu instanzieren ist.
Doch leider wird kein OnAddingNew/AddNewCore Event geworfen.

Wenn ich meine BindingList von einem konkreten Typ erben lasse, funktioniert alles sofort bestens, es muss also an der Interface-Sache liegen. Beim GridView ist natürlich AllowUserToAddRows etc. gesetzt.

Habt ihr eine Idee, warum das nicht klappt?

Viele Grüße,
Rodney

29.07.2008 - 17:55 Uhr

Ich habe jetzt mal den Quelltext näher betrachtet, dabei ist mir folgendes aufgefallen.
Ein Treeview-Node mit Subnodes hat ja immer ein +/- Symbol zum Auf/Zuklappen.

Normalerweise sieht der zugrunde liegende HTML-Code so aus:


<a id="treeViewn0" href="javascript:TreeView_ToggleNode(treeView_Data,0,treeViewn0,' ',treeViewn0Nodes)"><img src="/WebSite2/WebResource.axd?d=nV_w0tddabHhA-Z9zethq8bW11d1zDXyeo7w1IoEDk81&amp;t=633197275885781250" alt="General reduzieren" style="border-width:0;" /></a

Dieser Code funktioniert. Bei mir wird merkwürdigerweise folgendes gerendert:


<a href="javascript:__doPostBack('ctl00$MainContentHolder$trvManagement','tc183c339-2585-40fb-940f-1164dcdf2b12')"><img src="/WebApplication/WebResource.axd?d=JLpxON5F-21sOAOLk6pqrGasoSPPqLqIVaTsmsnH79Y1&amp;t=633197275885781250" alt="General reduzieren" style="border-width:0;" /></a>

Ich verstehe überhaupt nicht, warum das Bild nun nicht mehr mit einer Javascript-Funktion sondern einem Postback verknüpft ist?

29.07.2008 - 02:17 Uhr

Ok, ich habe mir alles nochmal angeschaut und bekomme nun den korrekten HTML-Quellcode der nicht escaped ist.
Allerdings funktioniert das Auf/Zuklappen meiner TreeView-Nodes nun nicht mehr, bei jedem Klick wird eine JS-Exception geworfen:

Fehler: [Exception... "'Sys.ParameterCountException: Sys.ParameterCountException: Parameter count mismatch.' when calling method: [nsIDOMEventListener::handleEvent]"  nsresult: "0x8057001c (NS_ERROR_XPC_JS_THREW_JS_OBJECT)"  location: "JS frame :: http://localhost:49908/WebApplication/ScriptResource.axd?d=AuBEoqmKDBpIMV686s1Cl_cQT8VatqZN9caPoOYt_PiLb5eilWFqx-gcNftIiZ98yF-gdlD4muMXRQWoz1Smn5qJtAodXKLn5kNBdDBSnjo1&t=633413732720360000 :: Sys$Net$XMLHttpExecutor$abort :: line 4232"  data: no]
Quelldatei: http://localhost:49908/WebApplication/ScriptResource.axd?d=AuBEoqmKDBpIMV686s1Cl_cQT8VatqZN9caPoOYt_PiLb5eilWFqx-gcNftIiZ98yF-gdlD4muMXRQWoz1Smn5qJtAodXKLn5kNBdDBSnjo1&t=633413732720360000
Zeile: 4232

Hast du vielleicht auch noch eine Idee woran dies liegen könnte? Dieses verfluchte Control 🙁

28.07.2008 - 20:00 Uhr

Hallo Peter,

da habe ich meine Solution wohl etwas zu sehr vereinfacht.
In meinem richtigen Projekt nutze ich bereits ein CustomTreeNode.
In diesem überschreibe ich RenderPreText folgendermaßen:


protected override void RenderPreText(HtmlTextWriter writer)
{
    writer.Write(this.HtmlOutput);
    base.RenderPreText(writer);
}

wobei die Property HtmlOutput eben genau jenen Html-Code enthält, den ich in meiner Solution an den TreeNode-Konstruktur übergebe.

Es scheint also so zu sein, dass der HtmlTextWriter selbst, jeden Input encoded, oder?
Wie kann ich dies verhindern?

Vielen Dank für dein Mühe, Rodney

16.07.2008 - 17:49 Uhr

Hallo Peter,

ich habe eine kleine Website erstellt, die den Fehler reproduziert.
Das GridView scheint nicht korrekt gerendert zu werden.

Gruß, Rodney

16.07.2008 - 16:51 Uhr

Ich weiss jetzt nicht genau wo das hakt.

Ich hätte vielleicht dazusagen sollen, dass ich diese Prozedur im Prinzip 2mal mache. Einmal rendere ich mein GridView in einen String und füge diesen folgendermaßen in ein TreeView ein:


protected override void RenderPreText(HtmlTextWriter writer)
{
    writer.Write(gridViewHtmlOutput);
}

wobei das GridView ebenfalls mit o.g. Methode gerendert wird.
Danach versuche ich dann eben dieses TreeView zu rendern, wobei es zu den merkwürdigen Steuerzeichen kommt...

16.07.2008 - 12:32 Uhr

Hallo Leute,

mein Ziel ist es den HTML-Code von einem asp.net Steuerlement zu erhalten, darin ein paar Ersetzungen mit Replace zu machen (anders kann ich mich nicht in das Control einhaken) und dann diesen modifizierten HTML-Code einem DIV oder ähnlichem zuzuweisen, sodass dieser korrekt ausgegeben wird.

Wenn ich das Control mit der Standard-Methode in einen String rendere:


public static string RenderControl(Control ctrl)
{
    StringBuilder sb = new StringBuilder();
    StringWriter tw = new StringWriter(sb);
    HtmlTextWriter hw = new HtmlTextWriter(tw);

    ctrl.RenderControl(hw);
    return sb.ToString();
}

und dann folgendermaßen vorgehe:


string htmlOutput = Tools.RenderControl(trvManagement);
            htmlOutput = htmlOutput.
                Replace("<table cellpadding=\"0\" cellspacing=\"0\" style=\"border-width:0;\">",
                        "<table cellpadding=\"0\" cellspacing=\"0\" style=\"border-width:0; width: 100%;\">");
divContainer.InnerHtml = htmlOutput;

wird der entsprechende "htmlOutput" leider durch Steuerzeichen etc sehr verunstaltet, bspw ein Ausschnitt:


&lt;div>\\r\\n\\t&lt;table class=\\&quot;GridSelection\\&quot; cellspacing=\\&quot;0\\&quot; cellpadding=\\&quot;3\\&quot; rules=\\&quot;all\\&quot; 

bordercolor=\\&quot;#9D9B8E\\&quot; border=\\&quot;1\\&quot; id=\\&quot;ctl00_MainContentHolder_grdSelection_0\\&quot; style=\\&quot;border-

style:Solid;border-collapse:collapse;width: 100%25\\&quot;>\\r\\n\\t\\t&lt;tr>\\r\\n\\t\\t\\t&lt;th scope=\\&quot;col\\&quot;>&amp;nbsp;&lt;/th>&lt;th 

Wo muss ich da anders vorgehen, um einen korrekten htmlOutput zu bekommen?
Vielen Dank für eure Hilfe!

07.07.2008 - 03:33 Uhr

Hallo Leute,

ich probiere ein GridView auf die Breite von 100% des umgebenden DIVs zu bekommen. Die 100% wirken sich allerdings nicht auf das GridView aus, nur eine konkrete Pixelangabe verändert die Größe.

Das umgebende Element hat eine höhere Breite und zeigt dies mit einem Border an, man sieht also deutlich, dass das Grid nicht auf seine maximale Größe geht.

Die Spalten haben - bis auf eine einzige - alle eine festgelegte Breite.

Ich möchte nun erreichen, dass sich das Grid ausdehnt und dabei die Spaltenbreite der nicht festgelegten Spalte erhöht. Ist das irgendwie möglich? Prozentangaben bleiben scheinbar immer unberücksichtigt...

Gruß, Rodney

05.07.2008 - 03:23 Uhr

Hallo Leute,

ich versuche in meiner Website global Exceptions abzufangen.
Dafür habe ich mir von VS eine Global.asax erstellen lassen und die Application_Error Methode modifiziert:


    void Application_Error(object sender, EventArgs e) 
    { 
        // Code that runs when an unhandled error occurs
        Exception lastError = Server.GetLastError().GetBaseException();

        if (lastError.Message == "MyException")
        {
            Server.ClearError();
            Response.Redirect("Default.aspx");
        }
    }

Ziel soll es sein, bei einem SoapError der durch einen unautorisierten Webservice-Aufruf entstehen kann, auf eine Loginseite (Default.aspx) umzuleiten. Die Exception die vom Webservice geworfen wird, hat als Message "MyException".

Wenn jetzt aber diese Situation eintritt, scheint dieses globale Handling gar nicht beachtet zu werden und alles läuft wie immer. Wenn ich in VS debugge, springt er in die auslösende Codestelle und nicht ins Error-Handling wo ein Breakpoint gesetzt ist.

In der Dokumentation habe ich dazu nicht mehr gefunden, aber muss ich dieses Handling noch aktivieren oder sonstige Schritte durchführen? Ich möchte wirklich nur bei dieser "MyException"-Nachricht redirecten, andernfalls ganz normal die Errorseite anzeigen. (Also kommt CustomErrors mit DefaultRedirect nicht in Frage)

Gruß, Rodney

20.06.2008 - 16:03 Uhr

Die Sessionverwaltung ist in der Global.Asax definiert. Im Soapheader können Userdaten transportiert werden(dafür ist das Ding da).

Der SoapHeader sieht sehr interessant aus. Ich habe mal weiter gesucht und folgende anscheinend Standard-Methode dazu gefunden:
http://www.aspheute.com/artikel/20030502.htm

Nur frage ich mich folgendes:
Normalerweise melde ich mich als User ja einmal am Webservice an und rufe danach die verschiedenen Methoden auf. Wie kann ich nun im Webservice und im Kontext einer bestimmten Methode herausfinden welcher User sich geauthed hat?

19.06.2008 - 15:14 Uhr

Hallo Leute,

ich habe einen Webservice der von mehren Anwendungen (asp.net Website, Win-Forms Application) dazu genutzt wird, zentrale Daten bereitzustellen.

Jetzt habe ich das Problem, dass irgendwo die Userdaten "gecached" werden müssen. Ich wollte das eigenltich über eine Session im Webservice machen, was für die Win-Forms Applications auch gehen würden. Allerdings sieht der Webservice die Website ja nur als einzelnen und immer gleichen Partner und speichert dementsprechend die Daten in der GLEICHEN Session.

Normalerweise läuft es so ab, dass ich die Anwendungen am Webservice authen lasse, danach speichert dieser eine GUID (die den entsprechenden User identifiziert) in einer Session-Variable. Bei einem späteren Methodenaufruf schaut der Webservice auf eine GUID in der aktuellen Session gespeichert ist und kann damit auf den User rückschließen.

Wie bekomme ich es nun hin, das die einzelnen Verbindungsaufrufe der Website als eigene Session interpretiert werden? Oder gibt für das ganze Probem andere Lösungen?

BTW: Für die Website verwende ich Forms-Authentication, daher weiß die Website bei jedem Aufruf ob der User geauthed ist, nur muss ich dem Webservice natürlich mitteilen, um welchen User es sich handelt.

Ich hoffe das Problem ist klar geworden, und freue mich auf jetweden Ratschlag.

Gruß, Rodney

04.06.2008 - 22:30 Uhr

Hallo Leute,

ich habe ein Problem bezüglich eines dynamischen Controls, welches über ein unsichtbaren PlaceHolder in die Hierarchie eines UpdatePanels geladen wird. Dieses UpdatePanel hat ChildrenAsTriggers="false" und UpdateMode="Conditional".

In der Page_Init läuft dann der Code zur Erstellung des Controls ab:


GridView grid = new GridView();
grid.ID = "dynGrid";
grid.SelectedIndexChanged += new EventHandler(dynGrid_SelectedIndexChanged);
plhDynamicRendered.Controls.Add(grid);
AsyncPostBackTrigger trigger = new AsyncPostBackTrigger();
trigger.ControlID = grid.ID;
updatePanel.Triggers.Add(trigger);

Ich binde auch noch einen Trigger an das Control um eben den gewünschten AsyncPostBack zu bekommen. Danach wird das grid-Control in einen String gerendert und an einem Teil der Seite (auch innerhalb dieses UpdatePanels) angezeigt.
Wenn ich nun im Grid eine andere Zeile klicke wird allerdings kein SelectedIndexChanged-Ereignis gefeuert.

Es findet ein AsyncPostBack statt, der aber eben nicht zum Aufruf meiner Ereignisbehandlung führt.
Ist meine Reihenfolge falsch oder gibt es sonst noch etwas zu beachten?

Wichtig ist vielleicht noch, dass ich das dynamische Control bei jedem Aufruf von Page_Init erneut gleich erzeuge.
Meiner Meinung nach sind damit alle Erfordernisse erfüllt, aber irgendwo scheint es zu haken.

Danke schon einmal fürs Lesen, Rodney

03.06.2008 - 22:53 Uhr

Ich habe noch einmal gesucht, und endlich die Lösung für die benötigte Form mit runat=server gefunden. Es handelt sich hier um einen bekannten Bug. Um die Fehlermeldung zu umgehen muss einfach in der Klasse, die auch das Rendering durchführen soll folgende Methode eingefügt werden.


    public override void VerifyRenderingInServerForm(Control control)
    {
        // Confirms that an HtmlForm control is rendered for the
        // specified ASP.NET server control at run time.
        // No code required here.
    }

Damit klappt das Rendering ansich schon einmal gut, und man braucht dafür auch nicht die Server.Execute.

Es gibt allerdings direkt ein neues Problem 🙁
Ich bekomme keinen Postback von meinen so erzeugten Grids.


GridView grid = new GridView ();
grid.SelectedIndexChanged += new EventHandler(grid_SelectedIndexChanged);
this.divContainer.Controls.Add(grid);
StringWriter html = new StringWriter();
HtmlTextWriter writer = new HtmlTextWriter(html);
grid.RenderControl(writer);

Darstellen kann ich den über den in dem html-Objekt erzeugten Code korrekt, nur leider wird kein Postback an meine angehängte Methode gefeuert, wenn das Control geklickt wird. Ich benutze ja nicht die Darstellung im divContainer, das dient nur als versteckter Aufhängepunkt in der Control-Hierarchie.
Hat jemand da eine Idee? Binde ich das Event an der falschen Stelle? (alles im Page_Init)

03.06.2008 - 11:34 Uhr

*push*

Falls niemand mehr eine Idee hat, werde ich wohl probieren, ein komplett eigenes Control zu schreiben, sollte ja auch nicht so kompliziert sein.

02.06.2008 - 10:27 Uhr

Hallo Peter,

es scheint doch nicht an meinem CustomControl zu liegen, sondern evtl am GridView allgemein?


Page page = new Page();
GridView grid = new GridView();
grid.AutoGenerateColumns = false;
grid.AutoGenerateDeleteButton = false;
grid.AutoGenerateEditButton = false;
grid.AutoGenerateSelectButton = false;
grid.EnableViewState = false;
page.Controls.Add(grid);
StringWriter html = new StringWriter();
HttpContext.Current.Server.Execute(page, html, false);

Dieser Code aufgerufen im Page_Init führt zur selben Exception, obwohl hier ja keinerlei Controls vorhanden sein dürften, die das Rendern stören bzw eine umgebende Form bräuchten.

Viele Grüße,
Rodney

29.05.2008 - 14:59 Uhr

Es könnte wohl an dem Command-Field liegen. Ich habe mehrere Bound-Fields und ein hidden Command-Field, das ich benötige um auf Klicks auf die einzelnen Zeilen zu reagieren.

Ich kann nachher mal probieren, das Command-Field herauszunehmen. Du bist der Ansicht, dass es dann mit der normalen RenderToString-Methode funktionieren müsste, oder?

29.05.2008 - 13:35 Uhr

Der Grund, warum ich das überhaupt alles probiere ist folgender:

Ich habe ein Treeview, der auf der letzten Ebene keine normalen TreeNodes mehr enthalten soll, sondern eben mein Gridviews.

Jetzt war der Gedankengang dass ich bei der dynamischen Erstellung des Treeviews eben diese GridViews initialisiere, und in den Node rendere. Nur leider komme ich da überhaupt nicht weiter

29.05.2008 - 11:24 Uhr

Hallo Peter,

danke für die Richtigstellung.
Wie ich jetzt aber gerade bemerke ist die Funktion Page.LoadControl scheinbar nur für WebUserControls gedacht. Ich möchte aber ja mein CustomControl (GridView) laden.
Das resultiert dann in der Exception:

Das Objekt des Typs System.Web.Compilation.BuildResultCompiledAssembly kann nicht in Typ System.Web.Util.IWebObjectFactory umgewandelt werden.

Wenn ich stattdessen das Control einfach standardmäßig intialisiere über
CustomGridView grid = new CustomGridView();

kommt es bei HttpContext.Current.Server.Execute zur bekannten Exception

Das Steuerelement ctl00 vom Typ GridSelection muss in einem Formulartag mit runat=server positioniert werden.

Habe ich etwas übersehen, oder komme ich auch über diesen Weg nicht weiter?

27.05.2008 - 17:12 Uhr

Hallo Peter,
danke für den Link erst einmal.
Mit der "erweiterten" Funktion meinst du wohl diese


public string RenderUserControl(string path)
{
Page page = new Page();
UserControl control = (UserControl) page.LoadControl(path);
// Hier noch Kram einbauen um das Control mit Daten zufüllen
page.Controls.Add(control);
StringWriter html = new StringWriter();
HttpContext.Current.Service.Execute(page, html, false);
return html.ToString();
} 

Diesen Weg der Control-Erzeugung kannte ich noch überhaupt nicht, sieht aber auf jeden Fall interessant aus. Um Postback-Unterstützung für das zu erzeugende zu bekommen, muss dieser Teil laut MSDN, im OnInit aufgerufen werden.

Leider finde ich nirgendswo Infos über die vorletzte Zeile. Das Service-Objekt scheint bei mir nicht verfügbar zu sein, in der MSDN steht ebenso nichts dazu. Weißt du ob ich diese Methode erst per Reflection verfügbar machen muss?

Gruß, Rodney

27.05.2008 - 11:58 Uhr

Alles ins OnInit, in einem Schritt 🙂

Hallo Peter,

das Problem ist folgendes:
Wenn ich im OnInit das Grid erstelle, zu einem Control-Tree hinzufüge und dann direkt in einen String rendern möchte, bekomme ich die Meldung:

Das Steuerelement ctl01 vom Typ GridView muss in einem Formulartag mit runat=server positioniert werden.

Im Prinzip ja auch klar, da im OnInit, dass Form-Control von asp.net ja noch nicht gerendert wurde.

Nur wie umgeht man dieses Problem?

26.05.2008 - 17:58 Uhr

Benutze OnInit.

Hallo Peter,

danke für deine bisherige Hilfe schon einmal.
Wie würde man eine dynamische Erstellung denn prof. umsetzen?
Wenn ich im OnInit der aspx-Seite die Objekte erstelle und zu einer Control-Collection hinzufüge, rufen diese dann im Verlauf des Page_Load selbstständig ihre Load-Ereignisse auf?

Also müsste ich die Erstellung in 2 Schritten durchführen.

a) Die Objekte im OnInit erzeugen und zur Control-Collection hinzufügen
b) Nach dem Page_Load allle so hinzugefügten und nun fertigen Controls rendern und eben diesen Output eben zu meinen Nodes hinzufügen.

Richtig so?

Viele Grüße,
Rodney

26.05.2008 - 16:33 Uhr

Ok ich habe aber noch Probleme mit dem Lifecycle meiner Seite:

Ich will dynamisch ein GridView erstellen, das soll in dem Page_Load meiner aspx-Page passieren.
Wenn ich mit GridView grid = new GridView(); ein neues Grid erstelle, wird in diesem Objekt ja erstmal nicht das Load-Ereignis ausgelöst. Auch nicht, wenn ich es per Controls.Add(grid) zu meinem Control-Tree hinzufüge. Wie schaffe ich es im Page_Load, dass ein Objekt vollständig initialisiert wird, so als wäre es nicht dynamisch?

26.05.2008 - 15:01 Uhr

Prinzipiell wäre es doch auch möglich, dass ich das Grid in meiner Seite erstelle und zu einer Control-Collection hinzufüge und anschließend an ein TreeNode-Objekt übergebe, dass es seinerseits rendert, oder?

26.05.2008 - 11:39 Uhr

Entweder kommst du ohne aus, oder aber fügst die Controls irgendwo in den Control Tree (Egal wo, das kann die Form sein, oder sie Seite...).
Du stellst die Controls auf Visible = false und renderst das Ding dann im PreRender in deine Node.

Hallo Peter,

der Control Tree ist aber doch im Prinzip außerhalb meines Zugriffsbereiches. Ich befinde mich ja in einer Klasse, die keinen direkten Kontakt zu einer Control-Collection hat.

26.05.2008 - 10:45 Uhr

Also entweder musst du dir da selber was schreiben, oder machst es Quick & Dirty indem du das benötigte Control selber in einen String renderst und diesen anfügst.

Hallo Peter,

diesen Weg habe ich schon versucht. Ich überschreibe RenderPreText des TreeNodes und rendere dort mein Grid hinein. Allerdings habe ich das Problem, dass das Grid dann nicht automatisch "initialisiert" wird. Klar der Konstruktur wird aufgerufen wenn ich das GridView erstelle. Das Load-Ereignis bspw tritt im Grid aber nicht auf, da es ja nicht zu einer Control-Collection hinzugefügt wurde. Wie schaffe ich es, dass dieses Event auch aufgerufen wird, das Control also wie jedes andere "initialisiert" wird?

26.05.2008 - 08:53 Uhr

Ich habe das Problem gefunden:
Es lag daran, dass mein Event infolge meiner Programmierung schon durch den Konstruktor der Klasse aufgerufen wirde. Im asp.net Lifecycle ist hier das PageObjekt noch nicht vorhanden. Wenn das Event später ausgeführt wird, funktioniert alles bestens 🙂

26.05.2008 - 08:50 Uhr

Hallo Leute,

ich möchte einen angepassten TreeView erstellen, dazu ist es notwendig, dass auch die einzelnen TreeNodes angepasst werden.

Ich habe dazu eine Klasse CustomNode erstellt, die von TreeNode erbt und ein paar Methoden überschreibt (Render etc), was auch sehr gut funktioniert.

Nun will ich allerdings erreichen, dass dieser CustomNode noch ein anderes asp.net Control (in meinem Fall ein GridView) enthält. Um das GridView darstellbar zu machen, muss es doch einer Control-Collection hinzugefügt werden, damit später Ereignisse wie OnLoad automatisch ausgeführt werden. Nur enthält meine Basis - die TreeNode-Klasse - keine solche Collection. Wie kann ich hier weiter vorgehen?

22.05.2008 - 13:35 Uhr

Wie fügst du das Control zur Page hinzu?

Das Control befindet sich im Namespace CustomControls.
In der entsprechenden aspx-Webseite setze ich die Seitendirektive

<%@ Register TagPrefix="customControl" Namespace="CustomControls" %>

und binde das Control dann so ein

<customControl:GridSelection ID="grdSelection" runat="server" />

Gruß, Rodney

22.05.2008 - 10:57 Uhr

this.Page ist in meinem Kontext aber merkwürdigerweise null.
Ich überschreibe OnRowDataBound meines Grids folgendermaßen:


protected override void OnRowDataBound(GridViewRowEventArgs e)
{
    if (e.Row.RowType == DataControlRowType.DataRow)
    {
        string value = "Select$" + e.Row.RowIndex;
        string reference = this.Page.ClientScript.GetPostBackEventReference(
            (Control)this, value);
        e.Row.Attributes.Add("onclick", reference);
    }
    base.OnRowDataBound(e);
}

Wenn ich nun teste, dann bekomme ich beim Zugriff auf das Page-Objekt eine Exception, dass "Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt." sei. Wenn ich debugge, sehe ich, dass this.Page tatsächlich "null" ist.

20.05.2008 - 02:35 Uhr

Hallo Leute,

ich schreibe gerade ein CustomControl, dass ein asp.net GridView erweitert.
Im "RowDataBound"-Ereignis muss ich einigen Code einfügen, der unter anderem auch auf das Page-Objekt zugreifen muss.

Dieses scheint aber bei jeder Ausführung im CustomControl stets null zu sein.
Ich benötige es aber, um dann die ClientScript.GetPostBackEventReference-Methode aufzurufen.

Wenn ich versuche mir ein Page-Objekt per

Page pageObject = (Page)HttpContext.Current.Handler;

zu holen, scheint dies zwar zu klappen, die GetPostBackEventReference-Methode gibt dann allerdings nicht das korrekte Ergebnis zurück.

Als Control übergebe ich ihr gecastet den Auslöser (sender) des RowDataBound-Ereignisses, der ja eigentlich im CustomControl mit "this" übereinstimmen sollte.
Die Methode gibt dann etwas in der Art

__doPostBack('','Select$14')

zurück. Der erste Parameter müsste ja eigentlich das auslösende Objekt beinhalten, bleibt hier aber leer. Wo ist mein Fehler?

Gruß, Rodney

06.05.2008 - 11:39 Uhr

Ah ok, dann kann ich damit ja nicht viel anfange.
Peter, wenn du sagst es gibt AFAIK eine solche Unterstützung, dann meinst du eine Möglichkeit, ohne etwas überschreiben zu müssen, oder?

06.05.2008 - 00:15 Uhr

ich benutze für diesen Zweck bei jedem Klick auf ein Node NodeMouseClick.

Das Event seh ich bei meinem TreeNode garnicht?
Ich habe außer den "Standard"-Events nur TreeNodeCheckedChanged, TreeNodeCollapsed, TreeNodeDataBound, TreeNodeExpanded, TreeNodePopulate

Oder gibts da keine Intellisense Unterstützung oder so? 8o

05.05.2008 - 00:09 Uhr

protected override void OnSelectedIndexChanged(EventArgs e)

geht zweimal ab, wenn die Selektion geändert wird:
einmal um zu melden, daß die alte Selektion verlassen wurde, und direkt darauf die neue Selektion meldend.

Also ist die letzte Selektion immer null.

Das ist aber doch eigentlich nicht relevant für meine Funktion oder? Die Menge SelectedItems sollte ja zu jedem Zeitpunkt korrekt sein?

04.05.2008 - 23:42 Uhr

Hallo Leute,

gibt es irgendeine Möglichkeit, ein TreeView-Control in asp.net2 so zu verändern, dass bei einem Klick auf ein Node ein SelectedNodeChanged (oder ähnliches) Event gefeuert wird, unabhängig davon, ob dieser vorher schon selektiert war?

Ich möchte im Prinzip also nur einen Klick registrieren, dafür bietet das Control aber imo standardmäßig keine Event-Unterstützung.

Gruß, Rodney

04.05.2008 - 22:31 Uhr

Hallo Leute,

es ist ja von Hause aus leider nicht möglich dem ListBox-Control zu entnehmen, welches seiner Einträge als letztes selektiert wurde. Ich probiere daher gerade an einem eigenen Control, welches diese Funktionalität hinzufügt herum:


using System;
using System.Windows.Forms;

class CustomListBox : ListBox
{
    private SelectedObjectCollection lastSelectedItems;
    private object lastSelected;

    protected override void OnSelectedIndexChanged(EventArgs e)
    {
        lastSelected = null;

        if (lastSelectedItems != null)
        {
            foreach (object item in base.SelectedItems)
                if (!lastSelectedItems.Contains(item))
                    lastSelected = item;
        }
        else
        {
            this.lastSelected = base.SelectedItem;
        }

        this.lastSelectedItems = base.SelectedItems;
        base.OnSelectedIndexChanged(e);
    }

    public object LastSelected
    {
        get
        {
            return lastSelected;
        }
    }
}

Leider will das ganze nicht funktionieren, da es, wenn man mehr als ein Element anklickt als "LastSelected" null zurückgibt. Erkennt jemand einen Denk/Programmierfehler?

28.04.2008 - 11:47 Uhr

Formatiere deine Controls per CSS und gut ist.

Hi Peter,
habe ich in der Zwischenzeit auch schon so gemacht, trotzdem danke 😉

27.04.2008 - 14:44 Uhr

Hallo Leute,

ich habe mehrere Controls die untereinander angezeigt werden sollen.
Kann ich irgendwie erreichen, dass jedes Control automatisch vor sich einen Zeilenumbruch erzeugt, bzw unter dem vorherigen Control erscheint?

Der Hintergrund ist der, dass ich die Controls dynamisch auf visible/invisible schalte und dann natürlich die Zeilenumbrüche die ich mit <br /> erzeuge, sichtbar bleiben würden.

Natürlich kann man das Control zusammen mit dem Zeilenumbruch in einem andern Control kapseln und dessen Sichtbarkeit ändern, darauf würde ich aber gerne verzichten 😉

Gruß, Rodney

27.04.2008 - 14:41 Uhr

Ich habe das jetzt umgesetzt, funktioniert alles und genauso wie ich schon im 1. Post beschrieben habe.

26.04.2008 - 17:55 Uhr

Ich werde das dann einfach mal so probieren und dann hier posten wie schnell umsetzbar diese Vorgehensweise ist. Das ganze sollte doch eigentlich ein Standardproblem im Umgang mit GridViews sein, oder verwenden wirklich so viele Entwickler die eingebaute Datenbindung an ein SQL-Objekt?

25.04.2008 - 11:07 Uhr

Sollte das Ganze was mit Datenbindung zu tun haben (CommandArgument) good luck, geht dann irgendwie anders, keine Ahnung.

Evtl. hilft dann die SDK.

Genau darum gehts ja...
Wenn ich ein Command-Event mit CommandArgument ZUR LAUFZEIT an ein dynamischen LinkButton binde, dann löst das Event zwar aus, nur der Parameter wird leider nicht übertragen.

25.04.2008 - 03:34 Uhr

Hallo Leute,

ich probiere gerade damit herum, dynamisch zur Laufzeit per asp.net Ajax einen LinkButton meinem UpdatePanel hinzuzufügen, der dann ein CommandEvent auslösen soll. Dieses Event wird dann aber nicht richtig ausgelöst (ohne Parameter)

Das liegt ja wahrscheinlich daran, dass das Control in einem bestimmten Lifecycle der asp.net-Seite registriert sein muss, damit das Event richtig verarbeitet wird.

Habe ich nun irgendwelche anderen Möglichkeiten, als per default ein LinkButton (auf invisible) hinzuzufügen, der dann bei Bedarf mit einem CommandArgument versehen und sichtbar gemacht wird?

(Das problematische ist, dass es durchaus mehrere benötigte Buttons werden können..)

24.04.2008 - 19:51 Uhr

Hallo Leute,

ich versuche gerade ein neues WebUserControl zu erstellen, welches von einem bereits existierenden, von mir geschriebenen, WebUserControl erben soll.

Bei meiner Recherche habe ich dazu nichts passendes gefunden, ist das so überhaupt möglich? Mein Problem liegt schon darin, in dem neuen abgeleiteten Control das "Parent"-WebUserControl anzugeben, da ich es ja nicht mit einem Klassennamen ansprechen kann.

Wäre super, wenn mir da jemand kurz weiterhelfen könnte 🙂

Gruß, Rodney

24.04.2008 - 12:27 Uhr

Hallo Leute,

ich verwende ein asp.net GridView um meine Daten strukturiert anzuzeigen.
Als Datenquelle habe ich ein Struct-Array welches ich von einem Server lade, und das dann die entsprechenden Daten enthält.

Ich habe nun Spalten im GridView erstellt, die automatisch an den jeweiligen Wert des Structs gebunden sind.

Wie kann ich nun ein möglichst einfaches Sortieren implementieren?

Vom Framework scheint ja die Möglichkeit vorgesehen zu sein, direkt mit einer SQL-DataSource zu interagieren, wobei dann entsprechende Sort-Anweisungen an die SELECTs angefügt werden.

Sehe ich es richtig, dass ich nun bei meiner eigenen DataSource folgende Schritte unternehmen muss:
a) SortExpression für jede zu sortierende Spalte festlegen
b) Sorting-Event implementieren und abhängig von der Expression und SortDirection mein Array sortieren und neu binden.
c) dazu verschiedene Comparison-Methoden schreiben, die das Array sortieren

Ist mein Gedankengang soweit richtig und der am schnellsten umzusetzende? Clientseitig gibt es keine Möglichkeiten, oder?

23.04.2008 - 21:03 Uhr

Hallo Leute,

ich habe ein asp.net Formular, welches mehre Controls (TextBox, DropDown) enthält und die beim Page_Load auf einen bestimmten Wert gesetzt werden.
Jetzt würde ich gerne beim Auslösen eines Button-Clicks nur diejenigen Werte der Controls verarbeiten, die auch tatsächlich vom User geändert wurden.

Ich möchte ungern den Startwert zwischenspeichern und dann vergleichen, oder ein Event ala TextChanged verarbeiten und mir das Control merken.

Gibt es da irgendwelche gut anzuwendende Konzepte von Seiten des Frameworks?

18.04.2008 - 12:01 Uhr

Hallo Leute,

ich habe mir mit ein UserControl gebasteltet, welches die bequeme Datumsauswahl mit einer Textbox und angehängtem CalendarExtender über ajax erlaubt:


<div>
    <asp:TextBox ID="txtDate" />
    <asp:Image ID="imgCalendar" runat="server" ImageUrl="~/Ressources/calendar.png" style="cursor: pointer; " />
    <ajaxToolkit:CalendarExtender ID="calExtender" TargetControlID="txtDate" Format="yyyy-MM-dd" PopupButtonID="imgCalendar" runat="server" />
</div>

Der entsprechende Programmcode dahinter spielt erstmal keine Rolle, er tut nichts weiteres, als eine Property bereitzustellen, mit der dann das Datum gelesen/gesetzt werden kann.

Das Control zeigt jetzt aber ein sehr merkwürdiges Verhalten:
Wenn ich es außerhalb eines UpdatePanels setze, funktioniert es gut und wird richtig dargestellt. Wenn es sich in einem UpdatePanel befindet, geht aber das gesamte Design verloren: Die einzelnen Tage erscheinen als unverlinkter Text und ohne gemeinsamen Hintergrund einfach irgendwo auf der Webseite.

Wenn ich jetzt allerdings zusätzlich zu diesem UserControl in dem UpdatePanel ebenso eines außerhalb des UpdatePanels einfüge, funktioniert wieder alles perfekt 8o

Kann es sein, dass dort irgendein Bug exisitert, oder wende ich irgendetwas falsch an?