Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Community
  • |
  • Diskussionsforum
Dynamische Windows Forms (Controls on Demand)
ViperNeo
myCSharp.de - Member



Dabei seit:
Beiträge: 352
Herkunft: Darmstadt

Themenstarter:

Dynamische Windows Forms (Controls on Demand)

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
LastGentleman
myCSharp.de - Member

Avatar #avatar-1696.jpg


Dabei seit:
Beiträge: 1.274
Herkunft: Österreich

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1.002

beantworten | zitieren | melden

Hallo LastGentleman,
Zitat von 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
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

dann doch lieber:


Button b = sender as Button;
if(b != null)
{
// hier dein code
}
m0rius
myCSharp.de - Member

Avatar #avatar-3125.png


Dabei seit:
Beiträge: 1.002

beantworten | zitieren | melden

Hallo JAck30lena,
Zitat von 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
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

Zitat von ViperNeo
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
Zitat von ViperNeo
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.
Zitat von ViperNeo
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.
private Nachricht | Beiträge des Benutzers
BerndFfm
myCSharp.de - Team

Avatar #nZo9Gyth4VPDSxGqM4sT.jpg


Dabei seit:
Beiträge: 3.736
Herkunft: Frankfurt a.M.

beantworten | zitieren | melden

Hallo,
Zitat
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.
Zitat
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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von BerndFfm am .
Workshop : Datenbanken mit ADO.NET
Xamarin Mobile App : Finderwille Einsatz App
Unternehmenssoftware : Quasar-3
private Nachricht | Beiträge des Benutzers
Gelöschter Benutzer

beantworten | zitieren | melden

Zitat
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....
ViperNeo
myCSharp.de - Member



Dabei seit:
Beiträge: 352
Herkunft: Darmstadt

Themenstarter:

beantworten | zitieren | melden

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
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo JAck30lena,
Zitat
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.
Zitat
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
private Nachricht | Beiträge des Benutzers
ErfinderDesRades
myCSharp.de - Experte

Avatar #avatar-3151.jpg


Dabei seit:
Beiträge: 5.299

beantworten | zitieren | melden

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ängerFehler zu bezeichnen -> [Tipp] Anfängerfehler == true / == false )
Der frühe Apfel fängt den Wurm.
private Nachricht | Beiträge des Benutzers
herbivore
myCSharp.de - Experte

Avatar #avatar-2627.gif


Dabei seit:
Beiträge: 49.486
Herkunft: Berlin

beantworten | zitieren | melden

Hallo ErfinderDesRades,

Anfängerunart 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
private Nachricht | Beiträge des Benutzers