Laden...

Kennt sich jemand mit WebControls aus?

Erstellt von naumann vor 18 Jahren Letzter Beitrag vor 18 Jahren 2.029 Views
N
naumann Themenstarter:in
61 Beiträge seit 2005
vor 18 Jahren
Kennt sich jemand mit WebControls aus?

Hi Leute,

hab folgendes Problem: Ich bin dabei meine eigene WebControl zu schreiben. Es geht um ein DataGird mit einer Navigationsleiste. Die Navigationsleite läuft auch, das Problem ist nur, dass ich meine Klasse von BaseDataLine ableiten muss, um das DataGrid darzustellen.
Meine Frage: Wozu dienen die Funktionen **CreateControlHierarchy **und **PrepareControlHierarchy. **Die beiden Methoden werden von BaseDataLine benötigt.
Hat einer von euch schonmal sowas in der Richtung gemacht? Eigentlich müsste er alles andere auch darstellen da BaseDataLine von WebControls abgeleitet ist, nur er zeigt mir im Designer an, dass die Control nicht dargestellt werden kann.

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo naumann!

Als allerersten Hinweis: Ich kenn mich nicht sooo gut aus, dass ich Dir darauf aus dem Stehgreif die richtige Antwort geben könnte.

Ich hab geschaut, und mir ist aufgefallen, dass Du eventuell die Klasse BaseDataList meinst, denn ...Line hab ich nicht gefunden.

CreateControlHierarchy und PrepareControlHierarchy würde ich jetzt rein aus dem Namen interpretieren, dass dies Methoden sind, die eine reihenfolge von eingebrachten Controls festhalten, bzw. dafür da sind um solch eine Möglichkeit zu schaffen.

Könntest Du noch das Interface hierzu rausfinden, dann kannst Du explizit danach schauen, denn dort findet man meist mehr. Oder sind das einfach Methoden, die zwingend von der Base Klasse vorgeschrieben sind? Dann würd ich die Methoden einfach implementieren und darin nur base.CreateControlHierarchy() aufrufen.

nur er zeigt mir im Designer an, dass die Control nicht dargestellt werden kann

Das hat erst mal nur bedingt etwas mit der Funktionalität zu tun, um hier aber eine genauere Aussage machen zu können, muss ich wissen, ob Du Deine Applikation (mit dem Control) überhaupt ausführen kannst, oder ob eine Exception geworfen wird.

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

N
naumann Themenstarter:in
61 Beiträge seit 2005
vor 18 Jahren

Erst mal sorry für den BaseDataLine Schreibfehler. Eine Schnittstelle konnte ich dazu nicht finden. Wie bekomme ich die Schnittstell zu der Klasse eigntlich raus. Vom Namen oder steht sowas in der Klassenbeschreibung?

Die Seite lässt sich ausführen, d.h. er gibt keinen Fehler aus. Das sind Methoden wie CreateChildControls. Die muss die Klasse ja haben. Nur meckert er rum, wenn ich die
CreateControlHierarchy Methode leer lasse.

Mein Problem ist ja, ich möchte ein DataGrid in die Control setzten. Nur braucht das Grid seine Eigenschaften.

Vielleicht bin ich komplett auf den Holzweg. Meine anfängliche Überlegung war, dass ich einfach eine Control (DataGrid) hinzufüge und dieses dann als Eigenschaft zur verfügung gebe, damit ich in dem Grid selbst ein DataSource bestimmen kann. Nur liesen sich die Untereigenschaften hiefür nicht verändern (wie z.B. DataSource). Vielleicht war das eine bessere Idee, nur hatte ich vielleicht dort was falsch gemacht.

N
4.644 Beiträge seit 2004
vor 18 Jahren

Rufe doch base.CreateControlHierarchy() auf.

N
naumann Themenstarter:in
61 Beiträge seit 2005
vor 18 Jahren

Das behebt leider auch nicht meinen Fehler. Warum kann er die Eigenschaftswerte vom Grid nicht ändern? Ich zeig euch einfach mal den Code.


DataGrid my_dgrid = new DataGrid();

public DataGrid ControlDataGrid
{
get {return my_dgrid;}
set {my_dgrid = value;}
}

protected override void Render(HtmlTextWriter output)
{
Controls.Add(my_dgrid);
}


4.506 Beiträge seit 2004
vor 18 Jahren

Hallo naumann!

Warum entwirfst Du dann nicht eine Klasse, die von DataGrid, anstatt von BaseDataList erbt?

Dann kannst Du auch Deine zusätzlichen Eigenschaften mit anlegen, und hast auch teilweise mit override, die Möglichkeit "unschöne" Methoden des DataGrid zu erweitern/ersetzen.

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

N
naumann Themenstarter:in
61 Beiträge seit 2005
vor 18 Jahren

Meine derzeitige Darstellung ist folgende. Ich hab eine Tabelle mit 2 Zeilen. Erste Spalte die Navigation. Zweite Spalte das Grid. Wenn ich jetzt aber von DataGrid erbe, kann ich doch keine Tabelle mehr darstellen oder doch. Könnte DataGrid überhaupt Unterelemente aufnehmen?

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo naumann!

Was hälst Du von der Idee eine einfache HtmlTabelle zu nehmen, die wie Du realisieren möchtest, 2 Zeilen enthält.

Da eine HtmlTabelle auf jeden Fall weitere Controls aufnehmen kann, würdest Du in dieser auch eine Navigation und ein DataGrid unterbringen können.

Manchmal helfen die Old-School Html-Basis Elemente mehr als man denkt 😉

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

N
naumann Themenstarter:in
61 Beiträge seit 2005
vor 18 Jahren

Die Darstellung krieg ich schon in einer ASP.Net Table hin. Nur wenn meine Klasse von DataGrid erbt, dann kann ich doch auch kein DataGrid in eine HTML-Tabelle machen. Probier mal bitte aus ob das bei dir geht. Erstelle eine neue WebCustomControl und lass die Klasse nicht WebControl erben sondern DataGrid. In der Prozedur Render kannste dann deine Controls hinzufügen.
Vielleicht verstehst du dann besser was ich meine.

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo naumann!

Jetzt siehst Du den Wald vor lauter Bäumen nicht mehr, glaub ich 😉

Ich meine Du kannst Weiterhin Deine Daten in einem DataGrid anzeigen, da spricht nix dagegen. Deine Navigation ist ein separates Control.

Dann hättest Du also 2 Controls. Diese kannst Du dann in einer HtmlTable oder auch einer ASP.NET Table zeilenweise integrieren.

In der Prozedur Render kannste dann deine Controls hinzufügen.

Das ist meiner Meinung nach IMMER zu spät um Controls hinzuzufügen, da dann keine Ereignisse des Controls mehr abgefangen werden können. Controls sollten immer in der "OnInit" Phase hinzugefügt werden. Idealerweise mit "Controls.Add".

Könnte DataGrid überhaupt Unterelemente aufnehmen

Das DataGrid kann nur "TableRows" übernehmen, diese wiederum nur TableCells. TableCells aber können jegliche Controls aufnehmen. Also sollte es auch möglich sein, Deine Navigation, wenn gewünscht in dem Datagrid anzuzeigen.

Hoffe ich konnte Dir helfen?

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

N
naumann Themenstarter:in
61 Beiträge seit 2005
vor 18 Jahren

Kannst du mir mal bitte ein kleines Codebespiel senden? Ich glaub nähmlich, ich seh den Wald vor lauter Bäumen wirklich nicht mehr.

So wie ich das verstanden habe, soll ich mir dann 2 Komponenten auf meine Seite ziehen. Ein Nav Leiste und ein Grid. Nur das wäre ja das gleiche wie am Anfang.

Bitte sagst, wenn ich das zu undeutlich erläutere. Ich kann das Teil mal hochladen.

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo naumann!

Also gut kurzes Beispiel als Html-Code in Deinem aspx-file.

[php]
<body MS_POSITIONING="GridLayout">
<form id="Form1" method="post" runat="server">

		&lt;table id=&quot;tblDisplay&quot; runat=&quot;server&quot;&gt;  
			&lt;tr&gt;  
				&lt;td&gt;  
					&lt;!-- Hier Deine Navigationsleiste //--&gt;  
					&lt;cc1:MeineNavigation id=&quot;navBar&quot; runat=&quot;server&quot;&gt;&lt;/cc1:MeineNavigation&gt;  
				&lt;/td&gt;  
			&lt;/tr&gt;  
			&lt;tr&gt;  
				&lt;td&gt;  
					&lt;!-- Hier das DataGrid //--&gt;  
					&lt;asp:DataGrid ID=&quot;grdDataDisplay&quot; Runat=&quot;server&quot;&gt;&lt;/asp:DataGrid&gt;  
				&lt;/td&gt;  
			&lt;/tr&gt;  
		&lt;/table&gt;  
		  
	&lt;/form&gt;  

[/php]

Das kannst Du auch produzieren, wenn Du als erstes eine HtmlTable in Deinen Designer ziehst, dann in diese Tabelle die Nav-Leiste und ein DataGrid ziehst. Ergebnis dasselbe 😉

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”

N
naumann Themenstarter:in
61 Beiträge seit 2005
vor 18 Jahren

Mein Ziel ist es, dass ich meine DataGrid Komponente nur einmal schreibe und bei all meinen anderen Projekten wieder benutze. Nur wenn ich mein DataGrid nach meinen Wünschen bei jedem mal wieder aufsetze, ist das ziemlich nervige schreibarbeit.

Aus diesem Grund hab ich mich entschlossen mich ein bisschen mehr mit User Controls zu beschäftigen. (ascx-Dateien sind zwar ziemlich hilfreich, jedoch kann ich diese nicht Code aufrufen - bitte schreibt wenn ich falsch liege 😉)

Kennt vielleicht einer von euch eine gute Hilfeseite bzw. Buch wo dies etwas ausführlicher beschrieben wird?

Ich lade am Freitag mal den komplette Projekt Code hoch.

N
naumann Themenstarter:in
61 Beiträge seit 2005
vor 18 Jahren

Hier der versprochene Quellcode. Das ist eine Installationsdatei.

4.506 Beiträge seit 2004
vor 18 Jahren

Hallo naumann!

Hab jetzt Dein hochgeladenes File noch nicht angeschaut, aber mit Hilfe eines UserControls kannst Du trotzdem so vorgehen, wie ich es in meinem geposteten aspx-Code getan habe. Dann allerdings solltest Du die Elemente im C#-Code erzeugen und bauen, und nicht im "Html"-Code.

Die Vorgehensweise ist aber die selbe:
Neues Objekt HtmlTable, diesem dann TableRow und TableCells zuweisen. Die TableCells kannst Du dann einmal mit Deinem Navi-Control befüllen, und anderes mal mit Deinem DataGrid. Das ganze dann als Klassenvariable halten, und fertig ist Dein User-Control 😉

Ciao
Norman-Timo

A: “Wie ist denn das Wetter bei euch?”
B: “Caps Lock.”
A: “Hä?”
B: “Na ja, Shift ohne Ende!”