C# Objekte erstellen via Serialisierung

bascaro

Grünschnabel
Hey Leute!
ich hab bei Google auf die spezielle Frage nichts gefunden und wollte nun mal Spezialisten ran lassen ;)
Ich hab in VB ein Druckerprogramm geschrieben, das Drucker mit aktuellen Treibern und Anschluss (TCP/IP adresse oder lokal) per Klick in eine Liste mit aufnimmt und mit einem erneuten Klick alle in der Liste auftauchenden Drucker nacheinander installiert.

Zur Problemstellung:
Druckernamen mit Raumnummer und Anschlussart werden im VB in einer Checkbox angegeben.
(Raum 3008: HP LaserJet 4560dtn IP_10.155.32.233)
Das Problem liegt somit in erster linie am Layout
Wenn es was zu ändern gibt muss ich die Checkbox ändern und das Programm neu Kompilieren.
Das ganze in ne Textdatei zu schreiben und diese auslesen is mir zu einfach.
Es sollte möglichst ein Standart her und was eignet sich da besser als XML? ;)

Ich hab bei Google ein wenig research betrieben und bekam einen Einblick in Serialisierung mit XML.
Bischen damit rumgespielt und siehe da, es auch in der InitializeComponent void prozedur.
Nur wie erstelle ich damit ein Objekt in Abhänigkeit der in der XML Datei vorhandenen Aufrufe? :eek:

Ich hab nur kleine Erfahrungen in Java, bin neu in C# und hab somit keine Ahnung ob es möglich ist mit dieser Serialisierung ganze vom namen her unbekannte Objekte zu erstellen und visuell dar zu stellen (in diesem fall Checkboxen)
der name der Checkboxen ist kaum relevant sollte aber im besten fall eine fortlaufende Nummer ab 0 sein.

um den Überblick zu bewahren habe ich die ganzen Checkboxen in Groupboxen mit jeweiligem Stockwerk unterteilt.
Das Layout hat sich bewährt und ich wollte nicht auf ne Gridbox oder sonstiges umsteigen...

Hoffe jemand von euch kann mir mit meinem Problem helfen!
 
Hi!

Wenn ich das richtig verstanden habe, möchtest Du eure vorhandenen Drucker aus einer Art Config auslesen und via Checkboxen auswählbar machen? Wie Währe es mit einem ListView?

Ich hab hier bereits eine [post=1357063]kleine Demo[/post] dazu gemacht und nochmal für dich angepasst.
 

Anhänge

  • ListViewXmlDemo_PrinterSelect.zip
    83,5 KB · Aufrufe: 53
Dankeschön find ich echt Klasse, dass du zur Veranschaulichung gleich Beispiele anhängst ;)

aber so ne Listview würde letztendlich nem Grid entsprechen und das wird bei der Anzahl von Druckern die wir haben leider sehr unübersichtlich...
Klar könnte man für jedes Stockwerk und den jeweiligen Teil des Gebäudes wieder ein einzelnes ListView objekt platzieren und es per Visible-Wert in der Konfigfile anzeigen lassen oder nicht
Aber das ist dann letzendlich das was ich schon hab nur in grün.

Ich wollte mithilfe eines solchen Konfigurationsfiles (das übrigens in deiner Lösung Klasse aussieht ;) ) ganze Objekte zur Laufzeit erstellen.

Nochmal zur Problemstellung wo ich absolut hänge:
Wir haben in einem Haus 2 Gebäudehälften welche unabhängig voneinander Raumnummern und Stockwerke haben (das eine hat 3 das andere 4 Stockwerke, das eine 3stellige das andere 4stellige Raumnummern)
im VB hab ich ins Layout Tabs für die jeweiligen "Flügel" und mit Groupboxen für die jeweiligen Stockwerke integriert.

Mit C# wollte ich folgendes erreichen ohne das Layout groß zu ändern:
Ich habe ein Programm für mehrere Häuser mit einer unterschiedlichen Anzahl von Flügeln ,Stockwerken und Druckern pro Stockwerk.
Bis jetzt muss ich bei änderungen eines Standortes das Programm neu Kompilieren. Wenn ich nun krank bin und sich ein Standort des Druckers ändert (das nach der letzten Analyse häufig der Fall sein wird) kann niemand die Namen ändern.
((Zur Info aber nicht relevant: das Programm ist so dynamisch dass man es mithilfe einer Konfigfile in das Startscript eines ADS-Servers einbinden kann und Drucker ohne Aufsicht beim starten des PC's installiert werden. Somit ist es wichtig, dass Änderungen gemacht werden können wenn kein Programmierer im Haus ist und da ich der einzige bin ist auch keine Ausfallsicherheit vorhanden ;) ))
Im Endeffekt soll es für jedes Haus ein eigenes Konfigfile geben, das einfach mithilfe von Parametern dem Programm übergeben wird.

Es gibt 2 Möglichkeiten dieses Problem zu realisieren
Ich nenne es mal Maximalfall und Minimalfall.

Der Maximalfall wäre die Objektmenge die Maximal auftritt auf die Form schmeissen.
Der Minimalfall wäre die Objektmenge auf die Form platzieren die ich immer benötige.

Wenn ich nun vom Maximalfall ausgehe (2 Tabs für die Flügel und 4 Groupboxen pro Tab für die Stockwerke dazu noch 10Checkboxen für die Drucker pro Stockwerk) und mit der Konfigurationsfile dann nur noch die Visible-Option steuer ist das in meinen Augen kein Vorteil den ich mir verschafft habe, sondern eher ein Nachteil.
Es wird in der XML-Datei sehr unübersichtlich und kaum noch bedienbar da man ja wissen muss wie die GUI voll bestückt aussieht.
Ein weiterer Nachteil wäre, dass ich immer an das Maximum der aktuell angebrachten Objekte gebunden bin. Wenn somit ein Drucker in Stock 1 wandert der mit 10 für das Programm schon voll wäre kann er nicht angezeigt werden und ich muss neu kompilieren.

Der Minimalfall:
Ich habe IMMER mindestens 1 Tab, 1 Groupbox und 1 Checkbox auf der Form und kopiere diese einfach je nachdem wieviel ich brauche.

Ich kenne vom VB dass es möglich ist mit der Load funktion ein neues Objekt mit einem Index zu erstellen, WENN bereits ein Template erstellt ist (Das berühmte Objekt mit dem Index 0). Die Steuerung würde dann über den jeweiligen Index des Objektes funktionieren.
Und Genau das ist der Optimalfall den ich in den Angriff genommen habe.
Ich möchte zur Laufzeit eine Datei auslesen und aus diesen Informationen heraus Objekte erstellen.

Meine frage ist wie löse ich das Problem am besten (Keine Ahnung obs Load funktion gibt und keine Ahnung von nix in C# :eek: )
Falls das alles zu komplex war hier noch ein kleines PAP ala MSPaint ;-)
PAP.JPG
 
Lassen wir mal das mit Minimal und Maximal. :)
Entweder etwas ist dynamisch oder nicht. Und dynamisch bekommt man alles, solange man in den entsprechenden Abstraktionsebenen arbeitet.

Danke für die ausführliche Erklärung, ich glaube die Anforderungen des ganzen jetzt gut genug verstanden zu haben. In deinem Fall lässt sich alles schön hierarchisch aufbauen und würde meines Erachtens auch ein völlig dynamisches Layout zulassen. :)

Mit Flügel meintest jetzt sicherlich eine Haushälfte? Und ein Flügel hat mehrere Etagen, welche wiederum mehrere Räume haben, worin sich letztendlich die Drucker befinden. Wenn man das ganze jetzt in einem UML festhalten würde, hätte man lauter Aggregatbeziehungen mit Kardinalitäten von 1 zu n.

Die unterste Schicht haben wir bereits, nämlich die Räume und deren Drucker. Was Du jetzt bloß machen müsstest, währe das Ganze in einer Etage zusammen zu fassen und diese dann wieder in einem Flügel zuzuordnen. Dafür musstest in dem XML 2 weitere Elemente hinzufügen. Also sinnbildlich: Config->Flügel->Etage->Raum->Drucker. Was gut währe zu wissen, ob ein Raum auch mehrere Drucker haben kann.

Um die Ebenen nun visuell darzustellen kann man unterschiedliche Steuerelemente hernehmen. Das einfachste währe hier einen TreeView zu verwenden, in dem man die Flügel, Etagen und evtl. auch die Räume abbildet, sofern dein Raum auch mehrere Drucker haben kann. Dazu einen Anzeigebereich der dem User dann die Drucker anzeigt, die ab einem Element abwärts in dem TreeView vorhanden sind. Dafür brauchst auch nur einen einzigen ListView, den Du immer nur updatest. :)

Ich weiß ehrlich gesagt nicht was dann noch unübersichtlich währe. ;)

Kannst Du dir erst mal was darunter vorstellen oder soll ich die Demo dahingehend erweitern bzw. überarbeiten?

Meine frage ist wie löse ich das Problem am besten (Keine Ahnung obs Load funktion gibt und keine Ahnung von nix in C# :eek: )
Die Sourcen kannst Dir auch zum besseren Verständniss in VB anschauen.
[thread=255334]Wichtig: C# zu VB.net, und umgekehrt.. - Stickie[/thread]
Und dann gibt es noch den Lutz Roeder's .NET Reflector.
 
perfekt jetzt sind wir auf einem nenner :)
Räume können mehrere Drucker haben
mit Flügel sind Gebäudehälften gemeint
und Flügel können unabhängig voneinander eine gewisse Anzahl von Etagen haben (Flügel 1 genannt Heßstrasse hat 3 Stockwerke und Flügel 2 Schellingstraße hat 4 Stockwerke)

Treeview is auch ne Möglichkeit, hab ich noch garnicht drüber nachgedacht
in solch einem Layout könnte ich dann sogar Alle Häuser abbilden, danke für den Tipp! ;)

Ich kann mir da drunter schon was vorstellen, brauchst dir nich nochmehr Arbeit machen, Dankeschön!
Schau mir mal die Links durch die du mir gegeben hast und versuch dann bischen zu basteln wie ich das am blödsten mache
mit der Treeview wärs natürlich auch mit der Load funktion hinfällig
werd das mal bei der Nächsten Sitzung ansprechen denn bedienen muss ich das Programm nicht ;)
Falls was ist meld ich mich nochma vorerst herzlichen Dank! :)

edit:
wird ungefähr am 8.März zu jener Besprechung gekommen sein, bis dahin wird das Projekt erstmal ruhen...
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück