Laden...

Frage zu Activator.CreateInstance für Formulare bzw. Alternative dafür

Erstellt von rock4k vor 15 Jahren Letzter Beitrag vor 15 Jahren 1.533 Views
R
rock4k Themenstarter:in
39 Beiträge seit 2008
vor 15 Jahren
Frage zu Activator.CreateInstance für Formulare bzw. Alternative dafür

Hallo,

ich habe folgendes Problem:

In einem Projekt habe ich viele Forms mit Listen (DataGridViews). Zu diesen Listen gibt es jeweils ein Edit-Formular.

Bisher habe ich dem Listen-Formular als Eigenschaft den Name des zugehörigen Edit-Formulars als String angegeben und eben über die Möglichkeit von Activator.CreateInstance das Edit-Formular zur Laufzeit instanziert.

Dieser Vorgang des Instanzierens dauert aber erheblich lang. In meinem Fall so 2-3 Sekunden.

Gibt es eine andere Möglichkeit des Formularhandlings?

Vielen Dank für Eure Hilfen....

Gruß Mario

Gelöschter Account
vor 15 Jahren

von datagridview erben und um ein property "EditFormular" erweitern geht nicht? ansonsten kann man das erben weglassen und noch in den "tag" eine instanz des editformulars mitgeben.

R
rock4k Themenstarter:in
39 Beiträge seit 2008
vor 15 Jahren

Um es mal genauer zu beschreiben. Ich habe mir bereits ein sehr leistungsfähiges DataGridView als UserControl geschaffen. Dieses hatte bisher als Eigenschaft eben den Namen des zugehörigen Edit-Formulars.

Wie ist das gemeint im Tag die Instanz des Edit-Formulars mitgeben? Könntest Du mir das genauer beschreiben?

Das Problem ist gerade die Instanzierung der Edit-Form.

Vielen Dank...

5.941 Beiträge seit 2005
vor 15 Jahren

Hallo rock4k

Mit dem Activator ists sicher langsamer, aber ganz sicher nicht 2, 3 Sekunden.
Mach mal ein Tracing deiner Anwendung, der Bock muss woanders liegen.

Gruss Peter

--
Microsoft MVP - Visual Developer ASP / ASP.NET, Switzerland 2007 - 2011

Gelöschter Account
vor 15 Jahren

was meinst du mit leistungsfähiges datagridview als usercontrol?

jedes control hat eine Eigenschaft "Tag" das ein object nehemn kann. in dieses kannst du z.b. eine instanz des editingcontrols packen. aber wenn du soweiso dein datagridview in ein usercontrol gepackt hast, dann kannst du ebensogut eine eigenschaft im usercontrol erstellen das typesafe ist.

was die performance anbelangt, so gebe ich Peter Bucher recht. versuch mal mit speedtrace herauszufinden, wo deine performance flöten geht. ich vermute mal, das das an den vielen usercontrols hängt, da sie alle ein datagridview beinhalten, welches recht teuer und umfangreich ist.

R
rock4k Themenstarter:in
39 Beiträge seit 2008
vor 15 Jahren

So ich habe mir mal das Speedtrace installiert und ein bischen herumprobiert.

Ich kann bis jetzt immer noch nich nachvollziehen, weshalb das öffnen eines Formulars über Activator.CreateInstance so lang dauert (gemessene Zeit: 2,4 Sekunden).

Also, das Programm ist eine MDI Anwendung mit einem MenuStrip. Die Menü-Einträge werden aus einer Datenbank geholt.

Das Click-Event aus dem Menü verarbeitet folgende Anweisungen:

private void MenuOpenForm(String sFormName, Boolean bRunOnce)
        {
            
            bool bCreateNew = true;
            string sFormType = "MyClient." + sFormName;
            if (bRunOnce)
                foreach (Form frm in MdiChildren)
                {
                    if (frm.GetType().ToString() == sFormType)
                    {
                        bCreateNew = false;
                        frm.Activate();
                    }
                }
            if (bCreateNew)
            {

                ObjectHandle obj = Activator.CreateInstance("MyClient", sFormType);
                IiwFPASBaseFormInterface ICLASS = (IBaseFormInterface)obj.Unwrap();

                ((Form)ICLASS).FormClosing += new FormClosingEventHandler(ChildFormClosing); // MDITab
                ((BaseForm)ICLASS).MDIText = ChildFormGetAvailableName(); // MDITab
                
                ICLASS.ShowForm(this, sParam);
                ChildFormAdd((Form)ICLASS); // MDITab
            }
        }

Beim debuggen habe ich eben festgestellt, dass es beim Aufruf von Activator.CreateInstance eine erheblich Verzögerung gibt.

Ich wäre auch bereit, eine völlig andere Technik der Formulare zu verwenden.

Grüße Mario

Gelöschter Account
vor 15 Jahren

in der auswertung von speedtrace siehst du eindeutig welche methode, wieviel zeit verfrisst. was kannst du bitte nciht nachvollziehen?

R
rock4k Themenstarter:in
39 Beiträge seit 2008
vor 15 Jahren

Also... ich habe es nun definitiv ausprobiert. ES scheitert tatsächlich an der Instanzierung der Forms. Bzw. ist dort diese GUI-Verzögerung.

Wenn ich ein Form vorher instanziere ist die Reaktionsverzögerung = 0. Nun habe ich mir doch mehr konstruktive Hilfe erwartet. Gerade im Bezug darauf, wie man viele Forms verwaltet. Habt ihr Erfahrungen mit größeren Projekten bzw. Anwendungen?

Vielen Dank.

S
54 Beiträge seit 2007
vor 15 Jahren

Habt ihr Erfahrungen mit größeren Projekten bzw. Anwendungen?

Ich nicht!

Aber ich weiss nicht ob die größe eines Projekts sich an der Anzahl der Forms misst. Ich weiss nicht ob es überhaupt gut ist sehr viele Forms zu verwenden. Mir ist jetzt auch kein Programm bekannt das mich mit sehr vielen Forms erschlägt.
Ich versuche möglichst zu vermeiden viele Forms zu benutzen , ich hab damit immer nur unmut, liegt aber wohl auch daran das ich kein Profi bin.

Ich denke mal das eine Form GUI technisch kein Leichtgewicht ist, sie vorher zur instanzieren macht vielleicht Sinn. Ausser Arbeitsspeicher und Ladezeit am Anfang kostet das wohl auch nichts.

Gelöschter Account
vor 15 Jahren

eine art "lazy-loading" dürfte helfen.

ps: das die performance beim instanziieren drauf geht ist mir bewusst. aber speedtrace offenbart einem, wo exakt die performance einbricht. damit meine ich auch frameworkaufrufe.

wenn du eine schleife hast, die 10 webbrowsercontrols instanziiert, dann siehst du auch, das eine instanz fast schon eine sekunde schluckt. das ganze mal 10 und schon hat man den peiniger.

ps: wieviele forms und controls im allgemeinen instanziierst du denn? was für controls sind das im allgemeinen? wiviele forms?