Laden...

Dynamische Windows Forms (Controls on Demand)

Erstellt von ViperNeo vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.293 Views
V
ViperNeo Themenstarter:in
352 Beiträge seit 2008
vor 14 Jahren
Dynamische Windows Forms (Controls on Demand)

Hallo Leute,

ich habe mir ein neues Projekt ausgedacht und habe dazu ein paar Fragen.

Und zwar möchte ich eine Anwendung dynamisch gestalten. Das heißt ich lege eine XML Datei an. In dieser ist eine Struktur vorgegeben, was auf der Form für Elemente erscheinen, wie diese verknüpft sind und was diese tun sollen.

Das Ziel ist es zum Beispiel Buttons dynamisch zu platzieren und deren Events per Konfiguration zu manipulieren.

Eine Form auf Basis dieser XML Datei zu generieren und die Controls dynamisch per Quellcode zu erzeugen ist kein Problem. Mein Problem aktuell ist nur, dass ich es nicht schaffe zum Beispiel die Click Events dynamisch zu schreiben.

Habe versucht ein globales Click-Event zu generieren und alle dynamischen Buttons darauf zu verweisen. Problem hierbei ist dann aber das ich die Buttons nicht mehr auseinanderhalten kann.

Hat jemand eine Idee wie man so etwas umsetzen könnte?

Grüße
ViperNeo

1.274 Beiträge seit 2005
vor 14 Jahren

ist der Button nicht im Event Handler das "Sender" Objekt das als Parameter rein kommt?

"Das Problem kennen ist wichtiger, als die Lösung zu finden, denn die genaue Darstellung des Problems führt automatisch zur richtigen Lösung." Albert Einstein

1.002 Beiträge seit 2007
vor 14 Jahren

Hallo LastGentleman,

ist der Button nicht im Event Handler das "Sender" Objekt das als Parameter rein kommt?

ja. Von daher bekommt man den Button leicht mit:

if (sender is Button)
{
    Button button = (Button)sender;
    // ...
}

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

Gelöschter Account
vor 14 Jahren

dann doch lieber:


Button b = sender as Button;
if(b != null)
{
// hier dein code
}

1.002 Beiträge seit 2007
vor 14 Jahren

Hallo JAck30lena,

dann doch lieber:

Haarspalterei ... Ansonsten [Tipp] Casten aber richtig: Begriffe wie Cast / is / as.

m0rius

Mein Blog: blog.mariusschulz.com
Hochwertige Malerarbeiten in Magdeburg und Umgebung: M'Decor, Ihr Maler für Magdeburg

5.299 Beiträge seit 2008
vor 14 Jahren

Das heißt ich lege eine XML Datei an. In dieser ist eine Struktur vorgegeben, was auf der Form für Elemente erscheinen, wie diese verknüpft sind und was diese tun sollen.

klingt ein bischen, als wollest du das Rad neu erfinden 😉 -> XAML in WPF

Das Ziel ist es zum Beispiel Buttons dynamisch zu platzieren und deren Events per Konfiguration zu manipulieren.

sorry, ich glaub nicht, dass da was leistungsfähiges bei rauskommen kann.
Wenn man alles so dynamisch machen will, hat man am Ende keine aussagekräftigen Codenamen mehr, sondern nur noch ein Array von Forms und ein Array von Buttons, eines von Textboxes, eines von Labels........
Oder ein einziges großes polymorphes Array von Controls.

Und wie soll man Code dafür schreiben?
Alle Controls, die man verwendet nur noch per Index ansprechen, und (beim polymorphen Array) auf den richtigen Typ casten?
da wirste schon nach einer halben Stunde deinen eigenen Code nicht mehr kapieren 😉

Nee, eiglich ist das Baukasten-Prinzip der VS-IDE schon ziemlich gut, und schwer zu toppen.

Mein Problem aktuell ist nur, dass ich es nicht schaffe zum Beispiel die Click Events dynamisch zu schreiben.

das berührt sich mit meiner obigen Frage, wie man für sowas überhaupt Code erstellen soll. Irgendwo hört das dynamische halt auf, und du mußt konkret coden, was die Anwendung denn tun soll.

Wennde deinen Ansatz also weiterverfolgst, müssteste einfach die Eventhandler so schreiben, als kenntest ddu schon das Control, dasse aufrufen soll.
Und in deinem Konfigurations-parse-Teil müssteste in einem recht großen switch festlegen, wes Control_.Click dem zugewiesen wird


AllControls[124].Click += Anwendung_SchließenHandler;

Das ist noch einfach. Jetzt versuch aber mal, eine Combobox zu befüllen, und SelectedIndexChanged aus zuwerten.
Oder konfiguriere ein DataGridView, dasses eine Liste mit AddressDaten gescheit anzeigt (Primärschlüssel weglassen, z.T. automatisch angepasste Spaltenbreiten, etc).

Der frühe Apfel fängt den Wurm.

3.825 Beiträge seit 2006
vor 14 Jahren

Hallo,

klingt ein bischen, als wollest du das Rad neu erfinden

das ist mir auch als erstes eingefallen : Willst Du WPF neu erfinden ?

Welcher Button das Event auslöst kannst Du am Namen des Button festfestellen (wenn Du ihn vorher zugewiesen hast) oder z.B. über Infomationen in der Tag-Eigenschaft.

Ich mach das auch teilweise so. Im 'Tag' habe ich die Informationen zum Data-Bindig stehen.

Und wie soll man Code dafür schreiben?
Alle Controls, die man verwendet nur noch per Index ansprechen, und (beim polymorphen Array) auf den richtigen Typ casten?
da wirste schon nach einer halben Stunde deinen eigenen Code nicht mehr kapieren

Wenn der Anwender z.B. Methoden / Events oder Funktionen / Aktionen zu dem Button im (selbstgemachten) Designer hinterlegt, hat ja weder der Anwender noch ViperNeo mit dem Index zu tun. Der Index wird ja nur intern genutzt.

Es gibt übrigens schon fertige Designer um WinForms zu designen. ich habe schonmal 2 getestet, einer von codeproject (der hat beim Verschieben immer geblinkt) und einen anderen. Ich weis aber nicht mehr genau wo, müsste ich suchen.

Grüße Bernd

Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3

Gelöschter Account
vor 14 Jahren

Haarspalterei ... Ansonsten [Tipp] Casten aber richtig: Begriffe wie Cast / is / as.

ein 'is' ist nur dann sinnvoll, wenn anschließend ein cast nicht notwenig ist. bei deiner variante wird insgesamt 2 mal gecastet und bei meiner nur einmal. daher ist es nicht unbedingt eine haarspalterei.

warum im artikel allerdings 'is' als effizienter dargestellt wird, ist mir schleierhaft. es ist nur dann effizienter wenn das anschließende casten wegbleibt....

V
ViperNeo Themenstarter:in
352 Beiträge seit 2008
vor 14 Jahren

Hallo,

vielen Dank für die vielen Antworten. Das mit dem sender Objekt habe ich vor lauter lauter total übersehen. Logisch komme ich so an die Buttons ran.

Neu erfinden möchte ich nichts. Es geht um ein OpenSource Terminalprojekt das ich starten möchte. Das ganze dynamische wird der Terminalplayer. Dieser zeigt dann Content an und wird per Buttons und einigen weiteren Funktionen manipuliert.

Grüße
ViperNeo

49.485 Beiträge seit 2005
vor 14 Jahren

bei deiner variante wird insgesamt 2 mal gecastet und bei meiner nur einmal. daher ist es nicht unbedingt eine haarspalterei.

naja, wir reden hier über einen EventHandler, der durch eine Benutzer-Aktion ausgelöst wird (also wenn es sehr hoch kommt, einmal pro Sekunde) und nicht über Code in einer Schleife, die milliardenfach durchlaufen wird. Da kann ich schon verstehen, wenn der Einwand der Haarspalterei kommt, weil es im konkreten Fall überhaupt keine Rolle spielt, obwohl ich deinen Hinweis grundsätzlich berechtigt finde, weil man sich as angewöhnen kann und es dann auch in der Schleife, die milliardenfach durchlaufen wird, automatisch richtig macht.

Ich würde vermutlich gar nicht abfragen, sondern gleich casten. Wenn man den EventHandler nur für Buttons registriert, ist ja dadurch sichergestellt, dass der Cast immer klappt.

warum im artikel allerdings 'is' als effizienter dargestellt wird, ist mir schleierhaft. is ist insofern (potentiell) effizienter als as, weil nur getestet, aber nicht umgewandelt werden muss. Praktisch gesehen wird das aber meistens nicht spürbar und u.U. nicht mal messbar sein.

herbivore){gray}){gray}

5.299 Beiträge seit 2008
vor 14 Jahren

Ich find

var b = sender as Button;

auch eleganter, aber nicht wesentlich wesentlich.
Halt ein bischen unschön, ähnlich, wie wenn jemand schreibt:


if(testVar == false){...}

tut performancemäßig, leserlicherweise etc. auch nix zur Sache, halt bisserl unschön.

(findich eiglich auch übertrieben, letzteres als Anfänger_Fehler_ zu bezeichnen -> [Tipp] Anfängerfehler == true / == false )

Der frühe Apfel fängt den Wurm.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo ErfinderDesRades,

Anfänger_unart _ wäre zwar vielleicht wirklich treffender, macht die Sache aber auch nicht besser. Und zu weichgewaschen darf die Bezeichnung auch nicht sein, denn immerhin sollen den Anfänger schon deutlich werden, dass sie sich das dringend abgewöhnen sollen. 😃 Aber ich denke, dass führt und dann doch zusehr vom Thema ab. Der Titel ist von mir so gewählt und ich sehe keinen Grund ihn zu ändern.

herbivore