2010-12-29 13 views
2

Ich habe eine Anwendung, mit der ich Steuerelemente in einem Formular dynamisch aus einer Datenbank erstellen kann. Das funktioniert gut, aber mein Problem ist folgendes:Dynamische Umwandlung eines Steuerelementtyps zur Laufzeit

private Type activeControlType;   

    private void addControl(ContainerControl inputControl, string ControlName, string Namespace, 
     string ControlDisplayText, DataRow drow, string cntrlName) 
    { 
     Assembly assem; 
     Type myType = Type.GetType(ControlName + ", " + Namespace); 
     assem = Assembly.GetAssembly(myType); 

     Type controlType = assem.GetType(ControlName); 
     object obj = Activator.CreateInstance(controlType); 
     Control tb = (Control)obj; 
     tb.Click += new EventHandler(Cntrl_Click); 
     inputControl.Controls.Add(tb); 
     activeControlType = controlType; 
    } 

    private void Cntrl_Click(object sender, EventArgs e) 
    { 
     string test = ((activeControlType)sender).Text; //Problem ??? 
    } 

Wie kann ich werfen dynamisch die Senderobjekt zu einer Klasse, die ich die Eigenschaftsfelder des darauf verweisen können.

Ich habe gegoogelt und fand versucht, mich alles, was ich über gekommen sind ..... Jetzt bin ich sehr verwirrt ... und brauchen etwas Hilfe

Thnx

JT

+0

Was ist Ihr endgültiges Ziel? Nur um den Text von jeder möglichen Kontrolle oder etwas mehr zu bekommen? –

+0

the.Text war nur ein Beispiel, am Ende des Tages möchte ich verschiedene Eigenschaften des Steuerelements bekommen, je nachdem, welche Art von Steuerelement es ist .... – JayT

+0

so 'dynamic' ist der einzige Weg - sei dankbar dafür .NET 4! :) –

Antwort

6

Sie können nur in einen Typ konvertieren, der zur Kompilierzeit bekannt ist. Entweder müssen Sie eine bekannte Basisklasse oder Schnittstelle verwenden, zu der Sie eine Umwandlung vornehmen können, oder Sie müssen eine Reflexion verwenden. In C# 4 ist der reflektionsbasierte Ansatz viel einfacher als in früheren Versionen, da er das Schlüsselwort dynamic einführt. Ich bevorzuge den statisch getippten Ansatz, wo es möglich ist.

In C# 4 Sie können dynamic verwenden:

dynamic dynSender=(dynamic)sender; 
dynSender.Text="A"; 

Oder wenn Sie wissen, dass es von Control abgeleitet ist:

Control controlSender=(Control)sender; 
controlSender.Text="A"; 

Und da Sie bereits gegossen Control in Ihre Kreation Code, wissen Sie, dass Ihr Objekt ist in Ihrem Beispiel von Control abgeleitet. Und da die Eigenschaft Text in Control deklariert ist, reicht dies, um darauf zuzugreifen.

0

In Ihrem Event-Handler, der Typ mit überprüfen "ist":

if (sender is TextBox) 
{ 
    var textBox = (TextBox)sender; 
    textbox.Text = "hello"; 
} 
+0

Anstatt mit 'ist' und dann Casting zu überprüfen, ist es besser, mit 'as' zu casten und auf Null zu testen – Fernando

Verwandte Themen