[ASP.NET] Usercontrols dynamisch toevoegen

Pagina: 1
Acties:

  • 6K
  • Registratie: September 2002
  • Laatst online: 19-01-2025

6K

is ook zo...

Topicstarter
Via een XML file, waarin staat welk usercontrol aangemaakt moet worden, wil ik controls toevoegen aan een placeholder.

Wat ik nu doe is de xmlfile de-serialiseren.
Vervolgens ga ik op de volgende manier de controls maken:

C#:
1
2
3
4
5
6
7
8
            placeholder1.Controls.Clear();

            foreach (InputType i in typesToUse.AllInputTypes)
            {
                System.Web.UI.UserControl myControl = (System.Web.UI.UserControl)LoadControl("InputControlFactory/" + i.UserControlType + ".ascx");
                myControl.Visible = true;
                placeholder1.Controls.Add(myControl);
            }

Probleem is dat het nu een standaard usercontrol is waardoor ik niet bij de specifieke onderdelen van dit control kan.
Bijv. 1 van de usercontrols is een label met een textbox. Dit label wil ik zetten naar aanleiding van de xml file (object model wat daarvan gecreeerd is, maar ik kan de label helemaal niet benaderen uiteraard op deze manier.

Hoe kan ik de usercontrol naar het juiste control casten? (want ik weet dus op voorhand niet welke dat dat is)

٩(͡๏̯͡๏)۶ ٩(●̮̮̃•̃)۶


  • TlighT
  • Registratie: Mei 2000
  • Laatst online: 22-03 10:40
C#:
1
2
3
4
5
if (myControl is MyUserControl)
{
    MyUserControl myUserControl = (MyUserControl) myControl;
    myUserControl.Label.Text = "blaat";
}

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Je moet eens naar Reflection kijken je kan bijvoorbeeld het volgende doen

C#:
1
2
Type type = myControl.GetType();
object value = type.InvokeMember( "Text", BindingFlags.Default | BindingFlags.GetProperty, null, myControl, null );


Als het aantal types beperkt is kun je natuurlijk ook gewoon met GetType() controleren wat voor type het is en dan casten. Maar als je ook de properties in je xml wilt definieren dan zul je het toch met Reflection moeten doen want dan weet je compile time nog niet welke mogenlijkheden je hebt.

[ Voor 43% gewijzigd door Woy op 10-05-2005 10:04 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • 6K
  • Registratie: September 2002
  • Laatst online: 19-01-2025

6K

is ook zo...

Topicstarter
okay, voor wie het nog wil weten, ik heb het opgelost door een Interface te maken:

C#:
1
2
3
4
5
6
foreach (InputType i in typesToUse.AllInputTypes)
{
       InputControlFactory.IInputControl myControl = (InputControlFactory.IInputControl)LoadControl("InputControlFactory/" + i.UserControlType + ".ascx");
       myControl.Description=i.Description;
       placeholder1.Controls.Add((System.Web.UI.Control)myControl);
}


waarbij de interface (voorlopig) niet meer doet dan:
C#:
1
2
3
4
5
public interface IInputControl
{
       string Description
       {get;set;}
}


en deze ingevuld wordt op het control als:
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
public string Description
{
      get
      {
          if(lblName==null)
              return string.Empty;
          return lblName.Text;
      }
      set
      {
          lblName.Text=value;
      }
}


de oplossing van Tlight werkte niet omdat ik dan dus geen controls toe kan voegen zonder de code aan te passen.

De oplossing van reflection heb ik voorheen gebruikt in winforms, ik geloof meteen als je zegt dat het ook in Asp zou moeten werken, maar ik kreeg het niet aan de praat. De bovenstaande oplossing biedt wat ik nodig heb. Bedankt voor jullie input (reflection ga ik zeker wel nog naar kijken als ik daar meer tijd voor heb)

[ Voor 64% gewijzigd door 6K op 11-05-2005 14:46 ]

٩(͡๏̯͡๏)۶ ٩(●̮̮̃•̃)۶


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
6K schreef op woensdag 11 mei 2005 @ 09:47:
De oplossing van reflection heb ik voorheen gebruikt in winforms, ik geloof meteen als je zegt dat het ook in Asp zou moeten werken, maar ik kreeg het niet aan de praat. De bovenstaande oplossing biedt wat ik nodig heb. Bedankt voor jullie input (reflection ga ik zeker wel nog naar kijken als ik daar meer tijd voor heb)
Reflection werkt in asp.net gewoon exact hetzelfde als in winforms. Je hebt tenslotte gewoon hetzelfde .net framework ter beschikking. Mischien dat je nog een refference naar de Reflection assembly toe moet voegen ( Het zou kunnen dat VS.NET dat bij winforms automatisch doet en bij asp.net niet ).

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • gorgi_19
  • Registratie: Mei 2002
  • Laatst online: 17:26

gorgi_19

Kruimeltjes zijn weer op :9

Is een abstract class, waarvan alle specifieke controls inheriten ipv UserControl dan niet eenvoudiger dan een interface?

[ Voor 9% gewijzigd door gorgi_19 op 11-05-2005 22:40 ]

Digitaal onderwijsmateriaal, leermateriaal voor hbo


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
gorgi_19 schreef op woensdag 11 mei 2005 @ 22:40:
Is een abstract class, waarvan alle specifieke controls inheriten ipv UserControl dan niet eenvoudiger dan een interface?
Dat ligt er natuurlijk aan wat je precies wilt. Als je contols hebt die allemaal een zelfde soort ding doen kan een Abstract class handig zijn. Als je alleen een soort description wilt loggen ofzo kan een interface voldoende zijn.

Als je echt in je xml aan wilt geven welke controls er toegevoegd worden en welke attributen er gezet worden. Waarvan je compile time niet weet welke controls er allemaal beschikbaar zijn dan heb je refflection nodig.

Maar een abstract class zou wel een mooie oplossing kunnen zijn als het alleen om standaard functionaliteit gaat die in alle controls weer terug komt.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1