Autor Beitrag
RBS2002
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: 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:

ausblenden C#-Quelltext
1:
2:
3:
    public CheckedListBox.ObjectCollection Liste2{
      get {return liste2.Items;}
    }


Danach in der Klasse vom Dialog:
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 29.11.08 13:19 
Hallo, willkommen im Forum! :welcome:

user profile iconRBS2002 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: 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 :D. 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19346
Erhaltene Danke: 1754

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Sa 29.11.08 13:45 
Naja, du erzeugst mit
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: 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:

ausblenden C#-Quelltext
1:
Application.Run(new MainForm());					


2. Benutzer öffnet Dialog über Button

ausblenden C#-Quelltext
1:
2:
3:
4:
Editor edit = new Editor();
if(edit.ShowDialog() == DialogResult.OK){
  //egal, juckt eh nicht      
}


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:

ausblenden C#-Quelltext
1:
2:
3:
public CheckedListBox.ObjectCollection Liste2{
  get {return liste2.Items;}
}


Der Editor verarbeitet es wie folgt:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: Sa 29.11.08 17:01 
Hallo,

Sebastian hat eigentlich schon alles gesagt. Aber zur Verdeutlichung nochmals:

user profile iconRBS2002 hat folgendes geschrieben Zum zitierten Posting springen:
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).

user profile iconRBS2002 hat folgendes geschrieben Zum zitierten Posting springen:
wenn ich nur

MainForm.Methode

aufrufe klappt es ja auch nicht.

Eben.

user profile iconRBS2002 hat folgendes geschrieben Zum zitierten Posting springen:

1. Hauptframe wird per Konstrukor aufgebaut und die Elemente werden initialisiert, Daten werden eingelesen, die Listen werden gefüllt:

ausblenden 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.

user profile iconRBS2002 hat folgendes geschrieben Zum zitierten Posting springen:
2. Benutzer öffnet Dialog über Button

ausblenden C#-Quelltext
1:
2:
3:
4:
Editor edit = new Editor();
if(edit.ShowDialog() == DialogResult.OK){
  //egal, juckt eh nicht      
}

Doch, das juckt. Denn an dieser Stelle kannst Du im MainForm Daten (z.B. Änderungen) aus dem Editor abholen.

user profile iconRBS2002 hat folgendes geschrieben Zum zitierten Posting springen:
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:

ausblenden 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:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
Editor edit = new Editor();
edit.Init(Liste2);

//  und in der Editor-Klasse so etwas:
public void Init(CheckedListBox.ObjectCollection items)
{
    liste3.Items.AddRange(items);
}


user profile iconRBS2002 hat folgendes geschrieben Zum zitierten Posting springen:
Der Editor verarbeitet es wie folgt:
ausblenden 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
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
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: 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 :D

Edit: Hat funktioniert:

Bei Editor-Form globale Variable und Methode:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
CheckedListBox.ObjectCollection list1;
public void setListe1(CheckedListBox.ObjectCollection items)
{
list1 = items;
}


Im Hauptprogramm dann natürlich

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
Editor edit = new Editor();
edit.setListe1(liste1.Items);
if(edit.ShowDialog() == DialogResult.OK){
//bekomme für Speicherung - Todo        
}


Wenn der Benutzer auf den Editorbutton klickt passiert dann natürlich das

ausblenden C#-Quelltext
1:
2:
3:
4:
void Button2Click(object sender, EventArgs e)
{
  liste1.Items.AddRange(list1);
}


Vielen Dank an alle Helfer ;)
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Sa 29.11.08 19:41 
user profile iconRBS2002 hat folgendes geschrieben Zum zitierten Posting springen:
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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 57



BeitragVerfasst: Sa 29.11.08 20:08 
ja, hast natürlich recht ;)