s0h0 Geschrieben 15. September 2008 Teilen Geschrieben 15. September 2008 hallo, ich bin ein noob mit usercontrols. hab ein usercontrol erstellt dass heisst usercontrol1.cs wie kann ich dass jetzt in ein control laden??? string controlPath = "~/testcontrol1.cs"; //was muss ich hier angeben????? Control c1 = new Control(); c1.Controls.Add(controlPath); tabControl1.TabPages[0].Controls.Add(c1); DANKE Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 16. September 2008 Teilen Geschrieben 16. September 2008 Dynamisches Laden, oder warum der Pfad? WPF, C# oder VB.Net? Warum verwendest du keinen Form-Designer? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
s0h0 Geschrieben 16. September 2008 Autor Teilen Geschrieben 16. September 2008 ja soll synamisch möglich sein, mit c#. kenne ich nicht den formdesigner. geht das nicht so mit code? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 16. September 2008 Teilen Geschrieben 16. September 2008 Doch, geht auch. Nur wenn du den Pfad nicht verwendest und nur eine neue (, leere) Instanz der Klasse erstellst, bringt das ja nix. Schau dir mal die Activator-Klasse an. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
s0h0 Geschrieben 16. September 2008 Autor Teilen Geschrieben 16. September 2008 (bearbeitet) hmm aber wenn ich es so mache kommt fehler... UserControl c1 = new UserControl(controlPath); also ich kann nur eine leere instanz erstellen. in webforms ging es so... mit dem link komm ich nicht wirklich weiter da geht es doch um etwas ganz anderes oder? ich möchte ja keine assemblys laden sondern ein usercontrol Bearbeitet 16. September 2008 von s0h0 Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 16. September 2008 Teilen Geschrieben 16. September 2008 hmm aber wenn ich es so mache kommt fehler... UserControl c1 = new UserControl(controlPath); Ja ist klar, weil es keinen Konstruktor mit einem Stringparameter gibt... also ich kann nur eine leere instanz erstellen. Jain. Du kannst dir über den Activator eine Instanz einer abgeleiteten Klasse erstellen, welche sich automatisch füllt. mit dem link komm ich nicht wirklich weiter da geht es doch um etwas ganz anderes oder? ich möchte ja keine assemblys laden sondern ein usercontrol Das ist schon klar. Aber du musst dem Aktivator sagen, in welchem Assembly (DLL/Exe/...) der Typ zu finden ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
s0h0 Geschrieben 16. September 2008 Autor Teilen Geschrieben 16. September 2008 wuerde es leichter gehen wenn es nicht dynamisch sein soll? also einfach zwei feste controls im code einbinden? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
s0h0 Geschrieben 16. September 2008 Autor Teilen Geschrieben 16. September 2008 maaan bin ich ein hirsch!!!! testcontrol tc = new testcontrol(); UserControl c1 = new UserControl(); c1 = tc; tabControl1.TabPages[1].Controls.Add(c1); trotzdem danke! Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 16. September 2008 Teilen Geschrieben 16. September 2008 maaan bin ich ein hirsch!!!! testcontrol tc = new testcontrol(); UserControl c1 = new UserControl(); c1 = tc; tabControl1.TabPages[1].Controls.Add(c1); trotzdem danke! Das ist kein dynamisches Einbinden sondern fest verdrahtet. Im Übrigen brauchst du kein c1. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
s0h0 Geschrieben 16. September 2008 Autor Teilen Geschrieben 16. September 2008 ja wie. testcontrol tc = new testcontrol(); testcontrol2 tc2 = new testcontrol2(); testcontrol3 tc3 = new testcontrol3(); UserControl c1 = new UserControl(); switch { case a: c1 = tc; case b: c1 = tc2 ...... } tabControl1.TabPages[1].Controls.Add(c1); so isses doch dann dynamisch oder? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 16. September 2008 Teilen Geschrieben 16. September 2008 ja wie. testcontrol tc = new testcontrol(); testcontrol2 tc2 = new testcontrol2(); testcontrol3 tc3 = new testcontrol3(); UserControl c1 = new UserControl(); switch { case a: c1 = tc; case b: c1 = tc2 ...... } tabControl1.TabPages[1].Controls.Add(c1); so isses doch dann dynamisch oder? Darüber lässt sich jetzt streiten. Objektiv betrachtet ist das immernoch fest verdrahtet. Dynamisch wäre es z.B., wenn du in der App.config diverse Sectionen für das Usercontrol schreibst, welches den Typ und assembly (Namespace) enthält, dieses dann via ConfigManager zur Laufzeit laden würdest und mit hilfe des Activators eine neue Instanz erstellst. Aber das ist sicherlich eine Geschmacksfrage, an deinem Beispiel würde ich allerdings folgendes ändern: UserControl c1 = null switch { case a: c1 = new testcontrol(); break; case b: c1 = new testcontrol2(); break; ...... default: c1 = new UserControl(); break; } tabControl1.TabPages[1].Controls.Add(c1); So erzeugst du nicht unnötige Klasseninstanzen, die du am Ende eh wieder verwirfst. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
s0h0 Geschrieben 16. September 2008 Autor Teilen Geschrieben 16. September 2008 das mit der app.config ist mir zu kompliziert... aber bei der änderung stimme ich auf jeden fall zu. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
s0h0 Geschrieben 16. September 2008 Autor Teilen Geschrieben 16. September 2008 wie gesagt hab die sachen auf der msdn seite ueber den activator nicht gerafft... Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 16. September 2008 Teilen Geschrieben 16. September 2008 das mit der app.config ist mir zu kompliziert... Naja, man muss halt abwegen, ob es für ein kleineres Beispielprojekt gedacht ist oder für eine größere Anwendung... wie gesagt hab die sachen auf der msdn seite ueber den activator nicht gerafft... An sich ist das eigentlich kein Problem. Der Activator ruft einen Konstruktor eines angegebenen Typs in einem bestimmten Namensbereich auf, daher muss man nur Typ und Namespace übergeben. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
s0h0 Geschrieben 16. September 2008 Autor Teilen Geschrieben 16. September 2008 ja die worte auf der seite habe ich schon verstanden nur den code nicht Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 16. September 2008 Teilen Geschrieben 16. September 2008 Na wenn du die Worte verstanden hast, dann brauchst du ja keinen Code... Vielleicht hilft dir das Beispiel ja mehr: using System; using System.Collections.Generic; using System.Text; namespace ActivatorTest { public interface IMyItem { string getText(); } public class Program { static void Main(string[] args) { IMyItem item = Activator.CreateInstance(typeof(MyItem1)) as IMyItem; Console.WriteLine(item.getText()); item = Activator.CreateInstance<MyItem2>(); Console.WriteLine(item.getText()); item = Activator.CreateInstance("ActivatorTest", "ActivatorTest.MyItem1").Unwrap() as IMyItem; Console.WriteLine(item.getText()); Console.Read(); } } public class MyItem1 : IMyItem { #region IMyItem Member public string getText() { return "Item 1"; } #endregion } public class MyItem2 : IMyItem { #region IMyItem Member public string getText() { return "Item 2"; } #endregion } } Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
s0h0 Geschrieben 16. September 2008 Autor Teilen Geschrieben 16. September 2008 hmm MyItem1 ist in dem fall wohl dass bzw die usercontrol(s)? Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
TDM Geschrieben 16. September 2008 Teilen Geschrieben 16. September 2008 Ja, z.B. Die Oberklasse wäre dann UserControl (hier das Interface IMyItem), folglich kannst du mit UserControl c1 = Activator.CreateInstance<testcontrol>(); bspw. eine Instanz für die Klasse testcontrol erstellen. Das bietet sich vor allem an, wenn es mehrere Abhängigkeiten sind. Du hattest in deinem Beispiel nähmlich nur eine Switchanweisung, was ist aber wenn es von verschiedenen Variablen abhängt, so dass die Klassen später mal testcontrol1_2_5_75_67_5678_irgendwas heißen?! Mit dem Activator kannst du dir halt anhand von irgendwelchen Einstellungen einen Namen zusammenfriemeln (lassen) und brauchst dann nur noch die Funktion aufrufen. Aber wie gesagt, man muss abwägen, ob das für die Anwendung sinnvoll ist. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
s0h0 Geschrieben 16. September 2008 Autor Teilen Geschrieben 16. September 2008 ahh ok, ich glaub jetzt verstehe ich es so ziemlich. ja war jetzt in dem fall nur fuer ein kleine uebung, da ich demnächst wahrscheinlich ein vorhandenes umfangreiches programm in controls auslagern soll. da könnte es dann gut sein dass ich das brauche. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.