Formload übergibt keine Werte



  • Hallo ihr Lieben,
    hier bin ich mal wieder. Ich weiß, dass ich als Anfänger maximal auf den Nerv gehe, aber ich bitte zu berücksichtigen, dass ich mich stets bemühe auch eigene Lösungen zu finden!

    Ich habe eine Form, welche eine listBox1 beinhaltet und zwei Buttons:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using Daten;
    
    namespace prg6
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
    
            private void Form1_Load(object sender, EventArgs e)
            {
                Kundentabelle kdtab = new Kundentabelle("d:\\heinemann\\Kunden.txt");
                kdtab.LoadFromFile();
    
                //List<Kunde> Kunden = kdtab.HoleMirKunden("12345");
                List<Kunde> Kunden = kdtab.HoleMirAlleKunden();
    
                foreach (Kunde Kd in Kunden)
                {
                    listBox1.Items.Add(Kd);
                }
                kdtab.SaveToFile();
            }
    
            private void btnBearbeiten_Click(object sender, EventArgs e)
            {
                Kunde kd = (Kunde)listBox1.SelectedItem;
    
                DlgKonto dlg = new DlgKonto();
    
                DialogResult rc = dlg.ShowDialog(this);
            }
    
            private void btnCancel_Click(object sender, EventArgs e)
            {
                Close();
            }
        }
    }
    

    Die listBox ließt Kundennamen aus einer Datei aus und gibt diese aus, was bereits problemslos funktioniert. Beim Klicken auf den Button "btnBearbeiten" solls sich eine neue Form öffnen des Namens "DlgKonto", welche mehrere Textboxen enthalten soll (was ebenfalls problemlos funktioniert). Was die Textboxen alles machen ist bis auf eine Ausnahme irrelevant, da ich mich da selber reinfuchsen möchte und versuchen möchte die Lösungen selbst zu finden, aber die eine Textbox bringt mich zur Verzweiflung, da alle Versuche bisher gescheitert sind.

    Und zwar soll in dieser Textbox der Name ausgegeben werden, welcher beim Drücken auf den Button "btnBearbeiten" markiert war in der listBox1.
    Die Form mit den Textboxen sieht programmiert so aus:

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Windows.Forms;
    using Daten;
    using System.IO;
    
    namespace prg6
    {
        public partial class DlgKonto : Form
        {
            public DlgKonto()
            {
                InitializeComponent();
            }
    
            private void btnOk_Click(object sender, EventArgs e)
            {
                DialogResult = System.Windows.Forms.DialogResult.OK;
                Close();
            }
    
            private void btnCancel2_Click(object sender, EventArgs e)
            {
                Close();
            }
    
            private void DlgKonto_Load(object sender, EventArgs e)
            {
                txtName.Text = (Kunde)listBox1.SelectedItem;
                txtOrt.Text = "Text";
            }
        }
    }
    

    Wie man sieht, stelle ich den "Text" in "txtOrt" als normalen String da und die Asugabe erfolgt ohne Probleme.
    Bei der Ausgabe des Namens, welcher markiert wurde stellen sich mir unzählige Probleme, zumahl die listBox1 in dem Kontext nicht vorhanden, so wie ich die hier programmiert habe.

    Für Hilfen und Denkanstöße wäre ich wirklich dankbar.

    PS: Alle Aufgaben werden in der folgenden Klasse verabreitet:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.IO;
    
    namespace Daten
    {
        public class Kundentabelle
        {
            List<Kunde> liste = new List<Kunde>();
    
            public string DateiName;
    
            public Kundentabelle(string UDatei)
            {
                DateiName = UDatei;
            }
    
            public void LoadFromFile()
            {
                StreamReader rd = new StreamReader(DateiName);
                string line;
    
                while ((line = rd.ReadLine()) != null)
                {
                    string[] words = line.Split('|');
    
                    Kunde Kd = new Kunde();
                    Kd.Name = words[1];
                    Kd.Konto = int.Parse(words[0]);
                    Kd.Strasse = words[2];
                    Kd.Postleitzahl = words[3];
                    Kd.Ort = words[4];
                    Kd.Kreditlimit = decimal.Parse(words[5]);
    
                    Kd.KreditlimitChanged += new EventHandler(Kd_KreditlimitChanged);
    
                    liste.Add(Kd);
                }
                rd.Close();
            }
    
            public void Kd_KreditlimitChanged(object sender, EventArgs e)
            {
                Console.WriteLine("Kreditlimit hat sich geändert ({0})", ((Kunde)sender).Name);
            }
    
            public void AusgabeConsole()
            {
                Console.WriteLine();
                Console.WriteLine();
                Console.ForegroundColor = ConsoleColor.Red;
                Console.WriteLine("Kundenliste:\n");
                Console.ForegroundColor = ConsoleColor.Gray;
                Console.WriteLine();
                Console.WriteLine();
                foreach (Adresse adr in liste)
                {
                    adr.AusgabeConsole();
                }
            }
    
            public void SaveToFile()
            {
                StreamWriter wr = new StreamWriter(DateiName);
    
                foreach (Kunde Kd in liste)
                {
                    wr.WriteLine("{0}|{1}|{2}|{3}|{4}|{5}", Kd.Konto , Kd.Name, Kd.Strasse, Kd.Postleitzahl, Kd.Ort, Kd.Kreditlimit);
                }
                wr.Close();
            }
    
            public Kunde HoleMirEinenKunden(int Kontobla)
            {    
                foreach (Kunde Kd in liste)
                {
                    if (Kontobla == Kd.Konto)
                    {
                        return Kd;
                    }
                }
                return null;
            }
    
            public List<Kunde> HoleMirKunden(string Postleitzahlen)
            {
                List<Kunde> Kundenliste = new List<Kunde>();
    
                foreach (Kunde Kd in liste)
                {
                    if (Postleitzahlen == Kd.Postleitzahl)
                    {
                        Kundenliste.Add(Kd);
                    }
                }
                return Kundenliste;
            }
    
            public List<Kunde> HoleMirAlleKunden()
            {
                return liste;
            }
    
        }
    }
    


  • Du kannst dem Konstruktor von DlgKonto beliebige Parameter übergeben. Also auch das ausgewählte Objekt deiner Listbox.
    Der Konstruktor speichert dieses Objekt dann in einer Feldvariable und schon hast Du im Load-Handler Zugriff darauf.



  • OK, das sieht bei mir jetzt so aus:

    namespace prg6
    {
        public partial class DlgKonto : Form
        {
            private string _SelectedItem;
    
            public DlgKonto()
            {
                InitializeComponent();
            }
    
            public string SelectedItem
            {  
                get
                { 
                    return __SelectedItem;
                }
                set
                { 
                    _SelectedItem= value;
                }
            }
    

    Gibt aber dennoch noch die Fehlermeldung, dass listBox1 im Kontext nicht vorhanden ist?



  • In DlgKonto:

    private Kunde kunde;
    public DlgKonto(Kunde kd) 
             { 
                 InitializeComponent(); 
                 kunde = kd;
             }
    
    private void DlgKonto_Load(object sender, EventArgs e) 
             { 
                 txtName.Text = kunde.Name;
                 txtOrt.Text = "Text"; 
             }
    

    Aufruf in Form1

    private void btnBearbeiten_Click(object sender, EventArgs e) 
             { 
                 Kunde kd = (Kunde)listBox1.SelectedItem; 
    
                 DlgKonto dlg = new DlgKonto(kd); 
    
                 DialogResult rc = dlg.ShowDialog(this); 
             }
    

    Ich glaube Du solltest Dir nochmal die Grundlagen ansehen, bevor Du GUIs programmierst.



  • Ich bin absolut deiner Meinung, dass ich die Grundlagen nochmal vertiefen sollte und nehme die konstruktive und ernstgemeinte Kritik gerne so hin. In meiner seit kurzem gestarteten Ausbildung ist es gerade so, dass ich keine Grundlagen erfahren habe und zusätzlich noch von c++ komme und somit Schwierigkeiten beim Umstieg habe. Die Aufgaben gehen hier leider weiter und ich komme deshalb immer nur am WE dazu, mein Wissen nochmal grundlegend zu stärken;) Momentan weiß ich mir gerade kaum anders zu helfen und ich bin euch, speziell dir, Dawid W und Dravere außerordentlich Dankbar für die Mühe, welche ich nicht als slebstverständlich erachte!

    Ich würde jetzt gerne noch was wissen, ob das korrekt ist:

    Den von dir erhaltenen Code, zum DlgKonto_Load habe ich etwas erweitert mit weiteren Kundendaten:

    private void DlgKonto_Load(object sender, EventArgs e)
            {
                txtName.Text = AktuellerKunde.Name;
                txtKonto.Text = (AktuellerKunde.Konto).ToString();
                txtKreditlimit.Text = (AktuellerKunde.Kreditlimit).ToString();
                txtStrasse.Text = AktuellerKunde.Strasse;
                txtPostleitzahl.Text = AktuellerKunde.Postleitzahl;
                txtOrt.Text = AktuellerKunde.Ort;
            }
    

    Wenn ich jetzt den Button OK klicke, sollen die Werte, die dann im txtXXX.Text stehen an das Objekt Kunde übergeben werden, damit sie später verarbeitet werden können (zum Beispiel in eine Datei gespeichert werden können etc.). Ist es so richtig, wenn ich das so versucht habe:

    private void btnOk_Click(object sender, EventArgs e)
            {
                DialogResult = System.Windows.Forms.DialogResult.OK;
                Kunde kd = new Kunde();
    
                AktuellerKunde.Name = kd.Name;
                AktuellerKunde.Konto=kd.Konto;
                AktuellerKunde.Kreditlimit=kd.Kreditlimit;
                AktuellerKunde.Strasse=kd.Strasse;
                AktuellerKunde.Postleitzahl=kd.Postleitzahl;
                AktuellerKunde.Ort = kd.Ort;
    
                Close();
            }
    

  • Administrator

    benutzer_1234 schrieb:

    Ich bin absolut deiner Meinung, dass ich die Grundlagen nochmal vertiefen sollte und nehme die konstruktive und ernstgemeinte Kritik gerne so hin. In meiner seit kurzem gestarteten Ausbildung ist es gerade so, dass ich keine Grundlagen erfahren habe und zusätzlich noch von c++ komme und somit Schwierigkeiten beim Umstieg habe.

    Also der Umstieg von C++ nach C# sollte wirklich leicht fallen. Ich denke hier kommen viele von C++ nach C#. Was du präsentierst, ist eher ein fehlen von absolut grundlegenden Programmierkenntnissen, welche man mit jeglicher Sprache sich aneignen kann.

    Ich meine, nehmen wir das aktuelle Problem. Du erstellst ein neues Objekt und weisst die Felder des neuen Objektes den des aktuellen Objektes zu. Wieso erwartest du, dass bei diesem Code die Eingaben in den aktuellen Kunden wandern? Das funktioniert so auch nicht in C++! Du sagst sogar selbst, dass die Daten nun in den txtXXX.Text Feldern drin steht. Wieso weist du dann nicht diese Werten den Feldern des aktuellen Kunden zu? Ich bin über deinen Gedankengang verwirrt 😕

    Grüssli



  • Achso also dann einfach so:

    private void btnOk_Click(object sender, EventArgs e)
            {
                DialogResult = System.Windows.Forms.DialogResult.OK;
                Kunde kd = new Kunde();
    
                AktuellerKunde.Name = txtName.Text;
                AktuellerKunde.Konto = int.Parse(txtKonto.Text);
                AktuellerKunde.Kreditlimit = decimal.Parse(txtKreditlimit.Text);
                AktuellerKunde.Strasse = txtStrasse.Text;
                AktuellerKunde.Postleitzahl = txtPostleitzahl.Text;
                AktuellerKunde.Ort = txtOrt.Text;
    
                Close();
            }
    

    Mein Gedankengang war glaube ich zu kompliziert. So wie du es sagst klingt es logisch. Alle Textboxen haben beim Loaden den Wert des aktuelllen Kunden und wenn ich klicke, sollen die Werte des aktuellen Kunden durch das überschrieben werden, was i nder Textbox drinnen steht. Total easy, aber irgendwie bin ich da vorher nicht drauf gestoßen, weil ich irgendwie die Werte, welche in den Textboxen stehen allgemein für das folgende Programm ändern wollte, so dass damit weitergearbeitet wird, was natürlich total falsch ist!



  • Dravere schrieb:

    Also der Umstieg von C++ nach C# sollte wirklich leicht fallen.

    War auch mein Weg. Und C# war eine Offenbarung an Klarheit, Eleganz, Robustheit und durchdachter BCL. Die Ausdrucksstärke kann spätestens seit LINQ auch nicht mehr in Frage gestellt werden.

    Aber so einfach wie oft dargestellt ist der Weg vom hochkomplexen C++ zum vermeintlich simplen C# dann doch nicht. C++ verleitet zum massiven Einsatz von Templates zu Lasten von Objektorientierung. Wenn man, trotz aller Komplexität, nur das kennt, muss man saubere OO erstmal lernen beim Wechsel zu C#.

    Zumindest ist das meine Erfahrung. Java und C# Leute sind stärker auf Entwurfsmuster und sauberes OO getrimmt als C++ Junkies, die am liebsten alles mit Template-Metaprogrammierung erschlagen. 😉


  • Administrator

    µ schrieb:

    Aber so einfach wie oft dargestellt ist der Weg vom hochkomplexen C++ zum vermeintlich simplen C# dann doch nicht. C++ verleitet zum massiven Einsatz von Templates zu Lasten von Objektorientierung. Wenn man, trotz aller Komplexität, nur das kennt, muss man saubere OO erstmal lernen beim Wechsel zu C#.

    Aber das hatte man meiner Meinung nach schnell raus. Man muss nur einmal probieren, die Generics wie Templates zu benutzen und schon hört man damit auf 😃

    µ schrieb:

    Java und C# Leute sind stärker auf Entwurfsmuster und sauberes OO getrimmt als C++ Junkies, die am liebsten alles mit Template-Metaprogrammierung erschlagen. 😉

    Sauberes OO? Ich würde eher sagen, C# und Java Leute werden zu reinem Klassendesign (heisst nicht OO!) gezwungen, auch wenn es nicht die sinnvollste Lösung wäre. C++ ist halt eine Multiparadigmen Sprache, wodurch man jeweils das Paradigma anwenden kann, welches für die Lösung am besten passt. Java und C# Leute quetschen alles in Klassen. Wenn es nicht passt, wird es halt passend gemacht 🙂

    Aber wir wollen hier kein C++ vs C#/Java Thread, ja? Ich denke, dass sind unter anderem auch sehr subjektive Kriterien 😃

    Grüssli



  • Du noch viel zu lernen hast. *Yoda*


Anmelden zum Antworten