Zum Inhalt springen

usercontrol einbinden in windows form


s0h0

Empfohlene Beiträge

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

Link zu diesem Kommentar
Auf anderen Seiten teilen

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 von s0h0
Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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?

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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

    }

}

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Link zu diesem Kommentar
Auf anderen Seiten teilen

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.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...