Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Probleme beim dyn. laden von UserControls
naumann
myCSharp.de - Member



Dabei seit:
Beiträge: 61

Themenstarter:

Probleme beim dyn. laden von UserControls

beantworten | zitieren | melden

Hallo;

nicht leicht das Problem zu zu erklären. Ich versuchs mal:

- ich habe eine ASPX Seite, auf welcher ich per LoadControl() dyn. eine UserControl lade
- jede UserControl Implementiert eine Schnittstelle:


public interface IExtention
{
PropertyCollection Propertys {get ;}
}

Diese binde ich in der Control ein:


public class content_list : System.Web.UI.UserControl, IExtention
{
PropertyCollection _props = new PropertyCollection(new string[] {"pid", "cid"})

public PropertyCollection Propertys
{
get {return _props;}
}
}

- diese Eigenschaft Propertys möchte ich in meiner ASPX Seite aufrufen. Ungefähr so:


IExtention cntrl = LoadControl("test.ascx";);
cntrl.Propertys.GetByName("pid";).Value ="bla";

Dabei meckert er jedoch rum, dass control nicht in IExtention umgewandelt werden kann. Wie kann ich jedoch die Eigenschaft aufrufen?

Ich hoffe, dass ich mein Problem rüber bringen konnte. Kennt jmd. ein Lösung?
private Nachricht | Beiträge des Benutzers
feadur
myCSharp.de - Member



Dabei seit:
Beiträge: 726
Herkunft: Bonn

beantworten | zitieren | melden


IExtention cntrl = LoadControl("test.ascx") as IExtention;
private Nachricht | Beiträge des Benutzers
naumann
myCSharp.de - Member



Dabei seit:
Beiträge: 61

Themenstarter:

beantworten | zitieren | melden

Wenn ich der Eigenschaft Propertys nun einen Wert zuweise meint er, dass das Objekt nicht instanziert ist. Wie könnte ich der Seite die Control hinzufügen? cntrl ist doch vom Typ IExtention und keine Control.

Ist das überhaupt möglich ein Member einer "unbekannten" Klasse aufzurufen?
private Nachricht | Beiträge des Benutzers
feadur
myCSharp.de - Member



Dabei seit:
Beiträge: 726
Herkunft: Bonn

beantworten | zitieren | melden

hallo,
ich verstehe grad dein problem nicht. "Propertys" hat laut definition deines interfaces keinen "set" modifier. daher kannst du "Propertys" natürlich auch keinen wert zuweisen.
Was meinst du mit "unbekannter klasse" ?

"cntrl" ist gleichermaßen vom Typ Control als auch vom Typ IExtention, da es per "as" von Control gecastet wurde.
Du kannst also einfach soetwas wie Page.Controls.Add(cntrl as Control); sagen.
private Nachricht | Beiträge des Benutzers
naumann
myCSharp.de - Member



Dabei seit:
Beiträge: 61

Themenstarter:

beantworten | zitieren | melden

Mein Fehler. Den Fehler(keine Objektinstanz) hat er nur ausgegeben, weil ich in meiner Extention noch einen Dummy Rückgabewert(null) von Propertys zurückgegeben habe.
Zitat
ich verstehe grad dein problem nicht. "Propertys" hat laut definition deines interfaces keinen "set" modifier. daher kannst du "Propertys" natürlich auch keinen wert zuweisen
Propertys ist eine Collection von Property Objekten. Ein einzellnes Property Objekt ist beschreibbar.
Zitat
"cntrl" ist gleichermaßen vom Typ Control als auch vom Typ IExtention, da es per "as" von Control gecastet wurde.
Du kannst also einfach soetwas wie Page.Controls.Add(cntrl as Control); sagen
Dieses gecastete Objekt muss man jedoch noch zu einer Control umwandeln:

Controls.Add( (Control) cntrl);

So funktioniert es. Das mit dem casten kannte ich bissher nicht. Jedoch fallen mir dabei noch weitere Ideen ein 8)
Vielen Dank feadur :D
private Nachricht | Beiträge des Benutzers
Lynix
myCSharp.de - Member



Dabei seit:
Beiträge: 670
Herkunft: Saarland

beantworten | zitieren | melden

Was gibt denn die LoadControl - Methode zurück, welchen Typ ? Wenn das was da zurück kommt kein IExtension ist, kannst du es natürlich nicht zu einem casten.

Das der Vorschlag mit dem "as" nicht funktioniert ist daher auch klar. "as" macht nix anderes als zu casten und wenn es nicht funktioniert hat, gibt es null zurück.

Du kannst es ja mal so versuchen um ein paar mehr Infos zu kriegen :


if(typeof(IExtension).IsAssignableFrom(LoadControl("test.ascx").GetType()))
{
//Was zurück kommt ist ein IExtension
}
else
{
//Was zurück kommt ist kein IExtension
}

Falls der else-Fall eintritt hast Du irgendwo einen Logik-Fehler, denn dann lädst Du etwas anderes als das was Du erwartet hast.
"It is not wise to be wise" - Sun Tzu
private Nachricht | Beiträge des Benutzers