Laden...

Probleme beim dyn. laden von UserControls

Erstellt von naumann vor 17 Jahren Letzter Beitrag vor 17 Jahren 1.567 Views
N
naumann Themenstarter:in
61 Beiträge seit 2005
vor 17 Jahren
Probleme beim dyn. laden von UserControls

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?

F
722 Beiträge seit 2005
vor 17 Jahren

IExtention cntrl = LoadControl("test.ascx") as IExtention;

N
naumann Themenstarter:in
61 Beiträge seit 2005
vor 17 Jahren

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?

F
722 Beiträge seit 2005
vor 17 Jahren

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.

N
naumann Themenstarter:in
61 Beiträge seit 2005
vor 17 Jahren

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. 😁

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.

"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 😄👍

L
667 Beiträge seit 2004
vor 17 Jahren

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