Jag laddar dynamiskt olika User Controls som användare kan ladda upp på servern. UC laddas upp och registreras i en XML-fil med info om namnet på UC. T.ex. Html.ascx. Nu har jag inte jobbat med dynamisk laddade "User Controls", men jag skulle tippa på att det egentligen bara är att "casta" den till rätt typ, och sedan accessa de publika fält som du vill ändra på. Du menar så här: Om du inte vet vad det är för typ på controllern, hur skall du då veta vilka fält som du skall editera? Man behöver iofs inte casta till en speciell typ. Fördelen med casting är att man i editorn får intellisense som hjälper en att visa vilka egenskaper som är tillgängliga och kompilatorn hjälper en att hitta fel. Till Björn: Jag kan ha en standard property i alla UC för att överföra data. T.ex. ID så att kontrollen kan söka info i en databas eller XML-fil. Ifall du har standard-fält som UserControllern måste implementera så kan du kräva att de som skapar den måste implementera ett speciellt interface som du ger till dem. Sen kan du cast:a till den interface-typen. Rikard, Rickard: objectet "Object" finns såklart i C# också, men ifall du vill accessa någon parameter, function etc på ett object så måste man casta det först. Det är C#-kompilatorn inte inte tillåter Late Binding. Man får lite sämre prestanda. Hej Björn! > Jag måste börja med säga att ditt kunnande är imponerande!Variabel till User Control
Hur kan jag överföra variabler till den laddade UC?
Dim myControl As Control = CType(LoadControl("~/" & UC & ".ascx"), Control)
Sv: Variabel till User Control
// MvH BjörneSv:Variabel till User Control
Dim myControl As Html = CType(LoadControl("~/Html.ascx"), Html)
myControl.Text = "Lite text"
Men eftersom det laddas upp nya UC som inte kan förprogrammeras på min sida så faller detta. Eller har jag missuppfattat dig?
Sv: Variabel till User Control
// MvH BjörneSv:Variabel till User Control
Kör man otypat (som Object) så funkar det lika bra, men man får ingen hjälp från utvecklingsmiljön.
// JohanSv: Variabel till User Control
Till Johan: Hur gör jag för att köra otypat?Sv:Variabel till User Control
Ett andra sätt du kan göra är att hämta properyn med reflection.
otypat kan du köra genom att sätta "Option Strict Off" och deklarera objetet till type "Object", och sedan bara accessa ".ID" på det objectet. (Jag är inte själv allt någon fan av Late Binding, eftersom jag programmerar i C#, där det inte finns).
En sak som du bör tänka på när du accessar en Property på en User Controll som någon annan har gjort så är det faktiskt en funktion som du kallar på. Det innebär att personen som gjort objektet kan göra i princip vad som helst mot din kod. Till och med accessa privata fält i dina objekt. Så säkerhetsrisken är överhängande. Du kan begränsa vad den User Controllern får gör med .NET-restriktioner (vilket jag inte har satt mig in i (än)).
// MvH BjörneSv: Variabel till User Control
Björne svarade på frågan om otypat så där har jag inget att tillägga.
Björne,
Allvar? GÅr det inte att ha otypat i C#? Då lärde man sig något nytt i dag också... :-)
Men jag funderar vidare. Object ligger ju i .Net platformen inte i VB namespacet så borde det inte gå att använda i C#.Net också? Kan förstå om det inte finns i miljöer utanför .Net.
// JohanSv:Variabel till User Control
Själv har jag inte saknat "Late Binding", och i de fallen som man inte vet vad det är för typ så använder man reflection.
// MvH BjörnSv: Variabel till User Control
Jag måste börja med säga att ditt kunnande är imponerande!
Hur implementerar jag ett standard interface?Sv:Variabel till User Control
Ah, smicker gör en lycklig =)
Interfacet implementerar du med:
<code>
Interface MyCompany.Interfaces.IanIDInterface
Property ID() As String
End Interface
</code>
Kompilera det till en dll och ge till den som skall implementera interfacet, eller skicka kodsnutten så kan han lägga in den själv. Det är dock viktigt att det fullständiga namnet på classen är exakt likadan.
Kunden skapar sedan sin class med:
<code>
Public Class MyCustomerClass
Implements MyCompany.Interfaces.IanIDInterface
... kundens implementation av classen och interfacet
End Class
</code>
// MvH Björne