Laden...

Mehrere Windows Forms aus einer Klasse laden

Erstellt von milchmanno vor 5 Jahren Letzter Beitrag vor 5 Jahren 1.229 Views
M
milchmanno Themenstarter:in
6 Beiträge seit 2019
vor 5 Jahren
Mehrere Windows Forms aus einer Klasse laden

Hi,

ich habe ein Programm geschrieben, das Daten aus einer XML Datei ausgibt, und sie visuell anzeigt. Geht in Richtung Server-Monitoring.

Das Programm ist so aufgebaut, das ich eine MainForm habe in die ich pro Server eine kleine Form (z.B. Form 1) lade und dort dann anzeige.
Da ich ca. 60 Server zu überwachen habe, möchte ich nicht für jeden Server eine neue Form bzw. deren Funktionen dahinter neu schreiben. Google konnte mir nach 30 min Suche nicht weiterhelfen.

Gibt es eine Möglichkeit, alle Forms aus einer Klasse, beispielsweise, zu starten?

Vielen Dank für die Hilfe.

1.029 Beiträge seit 2010
vor 5 Jahren

Hi,

deine Problembeschreibung klingt für mich nicht ausreichend 😕

Du hast hoffentlich nicht 60 verschiedene Klassen von Forms für letztendlich das selbe Design geschrieben? Falls ja: löschen und noch mal ordentlich machen.

Wie du 60 Forms auf einmal öffnest hängt jedenfalls davon ab, wie du diese überhaupt instanziierst. Dafür müssten wir ein bisl Code kennen.

Wenn ich sowas gemacht hätte - dann ist ja die Datenbasis eine Liste von (deserialisierten) C#-Objekte, über die man problemlos eine for/foreach-Schleife legen kann, in dieser Schleife - kann man dann auch Forms instanziieren und anzeigen.

Pseudo-Beispiel:


List<MyData> data = [XML deserialisieren];
foreach(var entry in data)
{
var serverForm = new MonitorForm();
serverForm.LoadServerData(entry);
serverForm.Show();
}

LG

M
milchmanno Themenstarter:in
6 Beiträge seit 2019
vor 5 Jahren

Hi Taipi88,

vielen Dank erstmal für die Antwort!
Nein, so schlau war ich das ich nicht 60 mal das Selbe geschrieben habe!:)

Habe ich bei deinem Pseudo-Beispiel richtig verstanden, das für jede "ID" in der XML-Datei eine neue Form erstellt wird? Oder ist mit Datenbasis was ganz anderes gemeint?

Das müsste auf meinen Code bezogen dann denke ich so aussehen:


.......
foreach(var entry in data)
{
    var serverForm = new MonitorForm();
    serverForm.LoadServerData(entry);
    serverForm.TopLevel = false;
    monitoringPanel.Add(serverForm);
    serverForm.Show();
}

Bitte korrigiere mich falls ich irgendwas falsch verstanden habe!

Die Frage die sich mir hier auftut ist, wie ich dem Programm sage, dass es die Form jedes mal in ein anderes Panel lädt.. beginnend bei "monitoringPanel1" bis "-60"..

1
124 Beiträge seit 2012
vor 5 Jahren

Hallo,

ich habe das Schnipsel mal um den Namen der Form erweitert.

int counter = 1;
foreach(var entry in data)
{
    var serverForm = new MonitorForm();
    serverForm.LoadServerData(entry);
    serverForm.TopLevel = false;
    serverForm.Name = "monitoringPanel "+counter;
    serverForm.Text = "monitoringPanel "+counter;
    monitoringPanel.Add(serverForm);
    serverForm.Show();
    counter++;
}
1.029 Beiträge seit 2010
vor 5 Jahren

Hi,

um ehrlich zu sein:
Keine Ahnung ob meine Annahme, dass du 60 Instanzen eines Forms haben willst richtig ist - so hatte ich dich lediglich verstanden.

Von mir aus können das genauso gut 60 Instanzen eines UserControls sein - ich weiß ja nicht, wie das bisher aussieht oder überhaupt aussehen soll.

Das Thema ist ja: Wenn du die Einzelwerte von 60 Servern darstellen möchtest fallen mir schon zig Methoden ein das zu bewerkstelligen. Und um ehrlich zu sein: Für 60 an der Zahl sind Forms und UserControls in meinen Augen nicht mehr das gelbe vom Ei. Ich würde da persönlich eher eine tabellarische Form mit Filtermöglichkeiten und ggf. einigen Charts bevorzugen. (Optional kann man dann vll noch per Click eine Detail-Form pro Server aufrufen) (Zumal 60 ein Wert ist, bei dem man davon ausgehen kann dass dieser sich ständig verändert - tendenziell nach oben)

Was die Instanziierung der Sachen angeht:
Sicher - du hast eine XML-Datei, aber in dieser XML-Datei wird es ja sicher je Server einen Knoten geben, worunter jeder Server wieder die eigenen Messwerte stehen hat. Wenn man's ordentlich macht - dann hat man:
a) Eine Klasse erstellt, die jeweils die Daten eines Serverknoten "behält"
b) Eine Liste, die je Server eine Instanz der vorgenannten Klasse enthält (List<MyObject>)

Wenn du daraus x-verschiedene Forms machen möchtest kann man eine Schleife (wie schon gezeigt) benutzen, falls dir ein tabellarisches Design auch sinnvoller erscheint (kann hier keiner außer dir wirklich beurteilen) dann kann DataBinding an eine DataGridView dich schon recht weit bringen.

Ein Hinweis zu WindowsForms allerdings generell: Versuche nicht all zu viele Controls auf einmal zu verwenden, jede Form, jedes Panel, jedes Label - all das braucht ein Handle. Das kostet Zeit - und die sind limitiert.

LG

M
milchmanno Themenstarter:in
6 Beiträge seit 2019
vor 5 Jahren

Alles klar, ich werde es mir noch 2-3 mal durchlesen aber ich denke ich hab's verstanden.
Die Lösung mit dem DGV und der Option genauere Details aufzurufen ist eine sehr gute Idee, werde mich morgen sofort dransetzen.

Vielen Dank euch beiden und vor allem Taipi! 😃

LG