| Autor |
Beitrag |
RBS2002
      
Beiträge: 57
|
Verfasst: Sa 29.11.08 12:51
Hi,
ich möchte eine Java Anwendung in C# umschreiben. Bisher hat das wirklich sehr gut geklappt - ausser in diesem einen Fall. Vielleicht ist es ganz trivial, aber da ich Anfänger in C# bin hoffe ich auf Hilfe.
Szenario: Der User klickt auf einem Button im Dialog, die Listeneinträge der CheckedListBox werden in die Dialogliste geladen.
Ich habe bisher ein paar Sachen versucht und bin bisher bei diesem letzten Versuch stehen geblieben:
In der Hauptklasse:
C#-Quelltext 1: 2: 3:
| public CheckedListBox.ObjectCollection Liste2{ get {return liste2.Items;} } |
Danach in der Klasse vom Dialog:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7:
| void Button2Click(object sender, EventArgs e) { MainForm main = new MainForm(); foreach(string s in main.Liste2){ liste1.Items.Add(s); } } |
Leider klappt dies bisher noch nicht. Wie gesagt, hoffe das mir jemand bei meinem Problem weiterhelfen kann.
Vielen Dank im Vorraus,
mfG RBS2002
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 29.11.08 13:19
Hallo, willkommen im Forum!
RBS2002 hat folgendes geschrieben : | | Leider klappt dies bisher noch nicht. |
Was klappt denn nicht? Also was passiert (nicht)?
So wie ich deinen Quelltext verstehe erzeugst du in deinem Dialog dein Hauptfenster. Soll das so sein? So ganz habe ich den Ablauf noch nicht verstanden. Von wo aus rufst du den Dialog auf?
|
|
RBS2002 
      
Beiträge: 57
|
Verfasst: Sa 29.11.08 13:25
Ganz normal - der Dialog wird erzeugt, show etc. ist auch klar, sonst würde er den Dialog ja auch nicht anzeigen  . Dialogaufruf vom Hauptframe aus. Die Liste im Haupftrame ist gefüllt. Die Elemente die in der Hauptframe-Liste stehen sollen nach einem Klick auf einen Button (der keinen Bezug zum DialogResult hat) gefüllt werden. Dies sollte der zweite Quellcode machen, macht er aber nicht (das heisst die Elemente bleiben leer). Habe schon mal probiert die Liste im Hauptframe auf public zu setzen und direkt darauf zuzugreifen, aber auch da wird scheinbar nichts an die Dialogliste weitergeleitet.
|
|
jaenicke
      
Beiträge: 19346
Erhaltene Danke: 1754
W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Sa 29.11.08 13:45
Naja, du erzeugst mit C#-Quelltext 1:
| MainForm main = new MainForm(); | ja ein neues Fenster. Meinst du nicht, es ist logisch, dass da nichts drin steht?
Hier wurde eine ähnliche Frage bereits gestellt:
www.c-sharp-forum.de/viewtopic.php?t=88171
Eine Antwort findest du z.B. in dem dort verlinkten Beitrag hier:
www.mycsharp.de/wbb2...ead.php?threadid=488
|
|
RBS2002 
      
Beiträge: 57
|
Verfasst: Sa 29.11.08 16:38
Naja, im Prinzip müsste er doch dann den Konstruktor aufrufen und in diesem neuen Fenster wird dann noch einmal genau das gleiche eingelesen (die Listeneinträge stehen ja in einer Datei und werden im Konstruktor eingelesen), also müsste das von meinem Verständniss her vollkommen egal sein... Und irgendwie brauche ich ja ein Fensterhandle auf das ich zugreifen kann, wenn ich nur
MainForm.Methode
aufrufe klappt es ja auch nicht.
Aber naja, danke für die Links - hätte nicht gedacht das es so kompliziert werden könnte.
Aber nochmal eine etwas genauer Erklärung falls mein Wille noch unklar sein sollte:
1. Hauptframe wird per Konstrukor aufgebaut und die Elemente werden initialisiert, Daten werden eingelesen, die Listen werden gefüllt:
C#-Quelltext 1:
| Application.Run(new MainForm()); |
2. Benutzer öffnet Dialog über Button
C#-Quelltext 1: 2: 3: 4:
| Editor edit = new Editor(); if(edit.ShowDialog() == DialogResult.OK){ } |
3. Der Benutzer möchte die Daten von der mainForm-Liste in die Editorliste laden. Dafür steht in der Mainform diese Getter-Funktion bereit:
C#-Quelltext 1: 2: 3:
| public CheckedListBox.ObjectCollection Liste2{ get {return liste2.Items;} } |
Der Editor verarbeitet es wie folgt:
C#-Quelltext 1: 2: 3: 4: 5: 6:
| void Button2Click(object sender, EventArgs e) { MainForm main = new MainForm() foreach(string s in main.Liste2){ liste1.Items.Add(s); } |
Wie gesagt, das klappt nicht. Hoffe das jetzt alles klar ist 
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Sa 29.11.08 17:01
Hallo,
Sebastian hat eigentlich schon alles gesagt. Aber zur Verdeutlichung nochmals:
RBS2002 hat folgendes geschrieben : | | Naja, im Prinzip müsste er doch dann den Konstruktor aufrufen und in diesem neuen Fenster wird dann noch einmal genau das gleiche eingelesen (die Listeneinträge stehen ja in einer Datei und werden im Konstruktor eingelesen), also müsste das von meinem Verständniss her vollkommen egal sein... Und irgendwie brauche ich ja ein Fensterhandle auf das ich zugreifen kann, |
Das eben soll nicht gelten! Das untergeordnete Formular soll nichts mit dem rufenden Formular machen (nur umgekehrt).
RBS2002 hat folgendes geschrieben : | wenn ich nur
MainForm.Methode
aufrufe klappt es ja auch nicht. |
Eben.
RBS2002 hat folgendes geschrieben : |
1. Hauptframe wird per Konstrukor aufgebaut und die Elemente werden initialisiert, Daten werden eingelesen, die Listen werden gefüllt:
C#-Quelltext 1:
| Application.Run(new MainForm()); | |
Das ist klar. Aber schmeiß bitte den Begriff "Hauptframe" weg: Frame gibt es in WinForms nicht; die Übersetzung von Form lautet Formular.
RBS2002 hat folgendes geschrieben : | 2. Benutzer öffnet Dialog über Button
C#-Quelltext 1: 2: 3: 4:
| Editor edit = new Editor(); if(edit.ShowDialog() == DialogResult.OK){ } | |
Doch, das juckt. Denn an dieser Stelle kannst Du im MainForm Daten (z.B. Änderungen) aus dem Editor abholen.
RBS2002 hat folgendes geschrieben : | 3. Der Benutzer möchte die Daten von der mainForm-Liste in die Editorliste laden. Dafür steht in der Mainform diese Getter-Funktion bereit:
C#-Quelltext 1: 2: 3:
| public CheckedListBox.ObjectCollection Liste2{ get {return liste2.Items;} } | |
Aber Du schreibst nichts davon, wie diese Daten an den Editor übergeben werden. Das geht z.B. mit einer public-Methode im Editor so:
C#-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| Editor edit = new Editor(); edit.Init(Liste2);
public void Init(CheckedListBox.ObjectCollection items) { liste3.Items.AddRange(items); } |
RBS2002 hat folgendes geschrieben : | Der Editor verarbeitet es wie folgt:
C#-Quelltext 1: 2: 3: 4: 5: 6:
| void Button2Click(object sender, EventArgs e) { MainForm main = new MainForm() foreach(string s in main.Liste2){ liste1.Items.Add(s); } |
Wie gesagt, das klappt nicht. Hoffe das jetzt alles klar ist  |
Natürlich klappt dieser Quatsch nicht! (Sorry, aber so deutlich muss ich es sagen:) Du erzeugst ein neues Hauptformular, machst etwas damit (nicht etwa mit dem vorhandenen Hauptformular!), und am Ende dieser Methode ist dieses zweite Formular sofort wieder ungültig. Das kann doch nichts sein!
Zusatzbemerkung: Sinnvolle Bezeichner sind immer wichtig. Bei Deinem Code kann niemand verstehen, wohin liste1, liste2, liste3 gehören.
Dein Hauptproblem scheint darin zu liegen, welches Objekt etwas machen darf und womit. Auch die Zugriffsberechtigungen private/public musst Du immer beachten.
Ich hoffe, ich konnte etwas klarstellen. Jürgen
|
|
RBS2002 
      
Beiträge: 57
|
Verfasst: Sa 29.11.08 17:23
da ich noch nichts aus dem Editor abholen möchte (die Daten aus dem Editor werden gespeichert, aber wie ich das mache weiss ich bereits) juckt es in dem Fall wirklich nicht da der Editor die Daten nicht verschicken soll sondern die Hauptform. Ansonsten danke für die Hinweise  (PS: 3 Kategorie, jede Kategorie hat seine Liste, die Zuordnung ist fehlerhaft, das weiss ich auch - hat aber nichts mit den Problem zu tun das ich habe)
Wie gesagt, der Editor soll nichts zum Start zugewiesen bekommen und auch nichts zurückschicken sondern, wie ersichtlich, über ein Button-Click Event (ich weiss jetzt nicht ob man das in C# auch so bezeichnet) Daten von der Hauptform holen, ohne irgendwelche Results etc. Der Button befindet sich natürlich in der Editor-Form.
|
|
JüTho
      
Beiträge: 2021
Erhaltene Danke: 6
Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
|
Verfasst: Sa 29.11.08 18:23
Puh, ein unübliches Vorgehen. Mein Vorschlag lautet eindeutig: Übergib beim Start des Editors alle drei Listen (wie in meiner Init-Methode), aber möglichst als List<T> oder DataTable o.ä. (die ist dann unabhängig von einem bestimmten Control). Im Editor kannst Du dann direkt auf die jeweilige Liste zugreifen und hast nicht mehr das Problem mit der Abstimmung zwischen den Forms.
Jürgen
PS. Es heißt in der Tat ButtonClick-Event oder EventHandler (wobei Letzteres meistens die konkrete Methode meint).
|
|
RBS2002 
      
Beiträge: 57
|
Verfasst: Sa 29.11.08 18:33
danke dir  Auf die Idee etwas zu übergeben und nicht gleich einzusetzen bin ich heute und gestern Abend irgendwie auch nicht gekommen - werde das gleich mal probieren
Edit: Hat funktioniert:
Bei Editor-Form globale Variable und Methode:
C#-Quelltext 1: 2: 3: 4: 5:
| CheckedListBox.ObjectCollection list1; public void setListe1(CheckedListBox.ObjectCollection items) { list1 = items; } |
Im Hauptprogramm dann natürlich
C#-Quelltext 1: 2: 3: 4: 5:
| Editor edit = new Editor(); edit.setListe1(liste1.Items); if(edit.ShowDialog() == DialogResult.OK){ } |
Wenn der Benutzer auf den Editorbutton klickt passiert dann natürlich das
C#-Quelltext 1: 2: 3: 4:
| void Button2Click(object sender, EventArgs e) { liste1.Items.AddRange(list1); } |
Vielen Dank an alle Helfer 
|
|
Kha
      
Beiträge: 3803
Erhaltene Danke: 176
Arch Linux
Python, C, C++ (vim)
|
Verfasst: Sa 29.11.08 19:41
RBS2002 hat folgendes geschrieben : | | Bei Editor-Form globale Variable und Methode: |
Globale Variablen gibts weder in Java noch in C#, nennen wir es lieber "(Instanzen-)Feld"  . Und statt der Methode könntest du hier auch einen Konstruktor mit Parameter einsetzen.
_________________ >λ=
|
|
RBS2002 
      
Beiträge: 57
|
Verfasst: Sa 29.11.08 20:08
ja, hast natürlich recht 
|
|
|