/ Forside / Teknologi / Udvikling / ASP / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
ASP
#NavnPoint
smorch 9259
Harlekin 1866
molokyle 1040
Steffanst.. 758
gandalf 657
smilly 564
gibson 560
cumano 530
MouseKeep.. 480
10  Random 410
.NET: Dynamisk registrering af user contro~
Fra : Kim Bach Petersen


Dato : 27-05-02 21:16

På .aspx-sider skal man registrere sine controls med noget der ligner

<%@ Register TagPrefix="UserControl" TagName="CtrlTekstblok"
Src="uc/tekstblok.ascx" %>

Kan dette gøres dynamisk? Altså ud fra en database, sådan at man på
progammeringstidspunktet ikke behøver at vide, hvilke controls der er til
rådighed, sådan der let kan tilføjes nye til systemet?

Kim
--
· www.kensho.dk · psykologi og spiritualitet ·



 
 
Jakob Andersen (27-05-2002)
Kommentar
Fra : Jakob Andersen


Dato : 27-05-02 21:51

"Kim Bach Petersen" <kim@kensho.dk> wrote in message
news:acu4d8$mmv$1@sunsite.dk...
> På .aspx-sider skal man registrere sine controls med noget der ligner
> <%@ Register TagPrefix="UserControl" TagName="CtrlTekstblok"
> Src="uc/tekstblok.ascx" %>
> Kan dette gøres dynamisk?

Nej, jeg har i hvertfald svært ved at se det for mig

--
Jakob Andersen



Kim Bach Petersen (27-05-2002)
Kommentar
Fra : Kim Bach Petersen


Dato : 27-05-02 22:16

> Nej, jeg har i hvertfald svært ved at se det for mig

Så må jeg finde på noget andet... :o|

Jeg har lavet side, der via placeholders dynamisk kan lave 2 kolonner med
varierende user controls ud fra en database (jævnfør nedenfor) og så ville
det være fedt om man også kunne tilføje nye typer user controls - sådan bare
for at sætte dynamikken i anden potens.

Kim

' Dim i As Integer = 0
' Dim Kolonne(1) As PlaceHolder
' Kolonne(0) = KolonneLeft
' Kolonne(1) = KolonneRight
' Dim ControlArray() As Control
' Do While DataReader.Read() = True
' ControlArray(i) = LoadControl(DataReader("ControlFilename"))
' CType(ControlArray(i), DataReader("ControlClassname")).Nummer =
DataReader("Nummer")
' Kolonne(DataReader("Placering")).Controls.Add(ControlArray(i))
' i += 1
' Loop



Jakob Andersen (27-05-2002)
Kommentar
Fra : Jakob Andersen


Dato : 27-05-02 22:27

"Kim Bach Petersen" <kim@kensho.dk> wrote in message
news:acu7mu$3au$1@sunsite.dk...
> Så må jeg finde på noget andet... :o|

Læg mærke til at jeg sagde jeg ikke kunne forestille mig det. Men et
umiddelbart forslag ville være at registrere din user control som en
assembly?

--
Jakob Andersen



Kim Bach Petersen (28-05-2002)
Kommentar
Fra : Kim Bach Petersen


Dato : 28-05-02 10:49

> Læg mærke til at jeg sagde jeg ikke kunne forestille mig det. Men et
> umiddelbart forslag ville være at registrere din user control som en
> assembly?

Ja, se det ligner noget - compsite controls (user controls i en assembly) er
sagen!

Kim



Jakob Andersen (28-05-2002)
Kommentar
Fra : Jakob Andersen


Dato : 28-05-02 10:50

"Kim Bach Petersen" <kim@kensho.dk> skrev i en meddelelse
news:acvjrd$epq$1@sunsite.dk...
> Ja, se det ligner noget - compsite controls (user controls i en assembly)
er
> sagen!

Smider du lige et indlæg hvis du får det i sving, det kunne være interresant
at se.

--
Jakob Andersen



Kim Bach Petersen (28-05-2002)
Kommentar
Fra : Kim Bach Petersen


Dato : 28-05-02 11:03

> Smider du lige et indlæg hvis du får det i sving, det kunne være
> interresant at se.

Klart!

Af gode grunde ligner det foreløbig ret meget, hvad der kan findes i
QusickStart under 'How Do I?' - 'Write my own server control?'...

Kim




Kim Bach Petersen (28-05-2002)
Kommentar
Fra : Kim Bach Petersen


Dato : 28-05-02 20:37

> Smider du lige et indlæg hvis du får det i sving, det kunne være
> interresant at se.

Min foreløbige konklusion er, at jeg blot får flyttet problemet et trin
bagud, fra .ascx til .dll, men at situationen grundlæggende er den samme.

Jeg tror måske, at det jeg leder efter er noget i retnignen af
procedurevariable, så nu kikker jeg i retningen af 'reference type' og
'deligates' - men det bliver unægteligt lidt abstrakt og jeg ved ikke helt,
om det er umage værd.

Kim




Anders Truels Nielse~ (29-05-2002)
Kommentar
Fra : Anders Truels Nielse~


Dato : 29-05-02 08:25

Jeps, IBuySpy Portalen (http://www.ibuyspyportal.com/) er et skoleeksempel
på dette (klik dokumentation oppe i højre hjørne).

Ideen er, at du definerer nogle placeholders på din side og så loader
usercontrols ind i dem.

public PlaceHolder minPlaceHolder;

void Page_Load()
{
UserControl fest = Page.LoadControl("fest.ascx");
minPlaceHolder.Controls.Add(fest);
}

Men kig på IBuySpy.

Anders


"Kim Bach Petersen" <kim@kensho.dk> wrote in message
news:acu4d8$mmv$1@sunsite.dk...
> På .aspx-sider skal man registrere sine controls med noget der ligner
>
> <%@ Register TagPrefix="UserControl" TagName="CtrlTekstblok"
> Src="uc/tekstblok.ascx" %>
>
> Kan dette gøres dynamisk? Altså ud fra en database, sådan at man på
> progammeringstidspunktet ikke behøver at vide, hvilke controls der er til
> rådighed, sådan der let kan tilføjes nye til systemet?
>
> Kim
> --
> · www.kensho.dk · psykologi og spiritualitet ·
>
>



Kim Bach Petersen (29-05-2002)
Kommentar
Fra : Kim Bach Petersen


Dato : 29-05-02 10:28

> Ideen er, at du definerer nogle placeholders på din side og så loader
> usercontrols ind i dem.

Det er præcis, hvad jeg allerede prøver. Og du har ret i, at det kan lade
sig gøre, som du skriver.

MEN det springende punkt er parameteroverførsel - så snart noget i stil med

CType(MyPlaceHolder, ControlClassname).Parameter = Value

kommer på banen, skal der umiddelbart en registrering til.

Hvis du mener noget andet, så er gode ideer MEGET velkomne.

Kim



Anders Truels Nielse~ (29-05-2002)
Kommentar
Fra : Anders Truels Nielse~


Dato : 29-05-02 11:26

Jeg tror at jeg ved hvad du mener (selvom jeg ikke helt forstår dit
eksempel - det ser ud som om at du cast'er en placeholder som din
usercontrol klasse?).

Jeg ser følgende problematik:

Du har ved database-opslag fundet ud af at en given side skal have tre
usercontrols, kaldet header, body og footer. Du laver en lille løkke som for
hver af disse loader usercontrol'en (ascx-filen) og popper den ind i
placeholderen ( minPH.Controls.Add() ).

Der er dog den lille tvist, at i body-usercontrollen har du defineret en
bgfarve-attribut som du godt kunne tænke dig at sætte nu du alligevel er i
gang. Dvs.

Dim fest As UserControl = CType(minUC, UserControl)
fest.bgfarve = "red"

Problemet er selvfølgelig, at du ikke på forhånd ved at den usercontrol
kommer.

Jeg ved ikke helt om det er dette du tænker på, men jeg har i hvert fald
selv fulgt den filosofi, at usercontrols'ne selv må skaffe sig de
infomationer de har brug for.

Alternativt skal du i din database definere hvilket attributter dine
usercontrols har og så dynamisk sætte dem. Jeg tror dog hurtigt at det kan
blive meget rodet.

Anders


"Kim Bach Petersen" <kim@kensho.dk> wrote in message
news:ad26up$h9o$1@sunsite.dk...
> > Ideen er, at du definerer nogle placeholders på din side og så loader
> > usercontrols ind i dem.
>
> Det er præcis, hvad jeg allerede prøver. Og du har ret i, at det kan lade
> sig gøre, som du skriver.
>
> MEN det springende punkt er parameteroverførsel - så snart noget i stil
med
>
> CType(MyPlaceHolder, ControlClassname).Parameter = Value
>
> kommer på banen, skal der umiddelbart en registrering til.
>
> Hvis du mener noget andet, så er gode ideer MEGET velkomne.
>
> Kim
>
>



Kim Bach Petersen (29-05-2002)
Kommentar
Fra : Kim Bach Petersen


Dato : 29-05-02 12:16

> Problemet er selvfølgelig, at du ikke på forhånd ved at den usercontrol
> kommer.

Præcis, men problemet er løst, jævnfør mit andet opslag. Og pointen er
simpelthen af spare et antal databasekald.

Kim



Kim Bach Petersen (29-05-2002)
Kommentar
Fra : Kim Bach Petersen


Dato : 29-05-02 12:10

Som lovet lige en skitse af løsningen - som selvfølgelig var ret oplagt, når
jeg nu har fundet den... Det var endnu et dybt kik i IBuySpy, der satte mig
på sporet.

Løsningen er at bruge OOP og oprette en ny klasse, der nedarver fra
'UserControl', men som har de ekstra egenskaber man har brug for til
parameteroverførsel:

Public Class PortalModuleControl : Inherits UserControl
Private _Nummer As Integer = 0
Public Property Nummer As Integer
Get
Return _Nummer
End Get
Set
_Nummer = Value
End Set
End Property
End Class

Dermed kan man overføre parametere uden at kende User Controlens specifikke
klassenavn og dermed kan man let loade controller ud fra en liste i en
database:

Dim Modul As PortalModuleControl = CType(LoadControl("myusercontrol.ascx"),
PortalModuleControl)
Modul.Nummer = 4
MyPlaceHolder.Controls.Add(Modul)

Bemærk tricket med 'CType', at User Controllen omdannes til vor egen klasse
og dermed får mulighed for at bære flere egenskaber og metoder med sig.

Det eneste, der nu mangler er, at enkelte User Controls, det vil sige
..ascx-siderne, skal erklæres som tilhørende vores nye udvidede klasse med:

<%@ Control Inherits="MyNamespace.PortalModuleControl" %>

og så kan egenskaben Nummer tilgås direkte.

Wow, så blev jeg så meget klogere på OOP!

Kim

--
· www.kensho.dk · psykologi og spiritualitet ·



Søg
Reklame
Statistik
Spørgsmål : 177504
Tips : 31968
Nyheder : 719565
Indlæg : 6408549
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste