webForumDet fria alternativet

Dynamisk usercontrol

2 svar · 416 visningar · startad av Mr Nils

Mr NilsMedlem sedan jan. 2000640 inlägg
#1

Jag skapar dynamiska usercontrols med:

Dim myControl As Control
myControl = Page.LoadControl(kontrollnamn & ".ascx")
myPlaceholder.Controls.Add(myControl)

Men har fastnat när det gäller att anropa en sub i en usercontrol. När man har statiska fungerar det ju med minkontrol.minsub, men detta funkar inte så bra.

(reserverar mig för att jag är ute och cyklar, klockan är mycket.. *zz*)

GladhMedlem sedan maj 20012 812 inlägg
#2

Eftersom du skapar en basecontrol (du dimmar den ju som control) så finns inte den metoden som du vill anropa med på din control (eftersom MS inte kan veta vilka metoder du vill ha med).

Så det du måste göra är att du typomvandlar bascontrolen till den kontrol som du faktisk skapar och där kan du sedan hitta din metod:

MyOwnControl myControl;
myControl = (MyOwnControl)Page.LoadControl(controlName + ".ascx");
myControl.MyMethod();

Här kommer du dock få ett lite problem eftersom du nu iprincip redan berättat vilken kontroll du vill använda och den dynamiska kontrollen du har tappat sin funktion. Men eftersom det verkar som du har samma metod i alla dina kontroller så har du två val att lösa detta, du skapar själv en bascontrol som innehåller denna metod och du ärver sedan från denna bascontrol istället för MS. Det kräver dock att du alltid vill göra samma saker i denna metod i alla dina kontroller, vilket inte är säkert. Det kan du lösa med abstract/virtuell och override (men det går vi inte in på).

Ett annat sätt är att du istället implementerar ett interface på alla dina kontroller. interfacet fungerar som ett kontrakt där du definerar att alla kontroller som har detta interface har denna metod som du kan kalla, men du säger inte vad metoden gör, bara att den finns. Typ så här:

public interface IMetod{
 void myMethod();
}

public class MyControl : IMetod, UserControl{

 //-- Implementerar IMetod interfacet
 public void MyMethod(){ ... do some stuff... }
 
 .
 .
 .
}

IMethod myControl;
myControl = (IMethod)Page.LoadControl(controlName + ".ascx");
myControl.MyMethod();

Nu kan du ladda alla dina olika usercontrols och så länge alla implementerar interface IMethod så kommer din kod att fungerar, det finna i kråksången är att du kanske bara vill göra något konkret i en av dina usercontroller, så fall implementerar du kod i metoden i den usercontrollen, medans i alla andra så lämnar du methoden tom.

- M

NickemannenMedlem sedan aug. 20003 575 inlägg
#3

Reflection kanske är ett alternativ annars också?

250 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
120 ms — hämta statistik (db)
128 ms — hämta tråd, inlägg och bilagor (db)