override string ToString Frage



  • Hallo!

    Für mein Studium soll ich ein WindowsForm Projekt machen.
    Hab dafür nun auch schon einiges zum Thema C# gelesen und versuche das ganze nun umzusetzen.

    Nun kommt aber doch ein erstes Problem, bei dem ich nicht weiß, wie ich das lösen könnte.

    Ich habe eine Klasse erstellt, die u.a. folgendes enthält:

    public class Person
    {
            public string Nummer { get; set; }
            public string Name { get; set; }
    
    ...
    
    public override string ToString()
            {
                return string.Format("{0}, {1}", Nummer, Name);
            }
    }
    

    Als Datenbasis verwenden wir eine MySQl Datenbank die schon entsprechende Datensätze enthält.
    Diese hole ich aus der DB und lese sie in eine List<Person> ein.

    ....
    List<Person> person = new List<Person>();
                            while (dr.Read())
                            {
                                person.Add(new Person { Nummer = dr.GetString(0), Name = dr.GetString(1) });
                            }
                            return person;
                        }
    ....
    

    Nun möchte ich die Liste an eine Combobox übergeben:

    cbxNummer.Items.AddRange(HolePersonenNummer().ToArray());
    

    Das klappt soweit prima:
    Anzeige erscheint wie gewünscht; Nummer, Name.

    So, nun mein Problem:
    Ich möchte das gleiche in einer anderen Form für den Namen machen und die schon vorhandene Methode (HolePersonenNummer) verwenden.
    Allerdings soll dann die Anzeige in der Combobox Name, Nummer sein.
    Auch wenn ich eine neue Methode schreibe, die zuerst den Namen ausliest erhalte ich in der Anzeige immer Nummer, Name.

    Das liegt vermutlich an der override string ToString() Methode in der Klasse Person?!
    Wie kann ich das Problem lösen, so dass meine Anzeige auf beim Namen wie gewünscht aussieht?

    Die override Methode möchte ich deshalb nicht unbedingt löschen (das wäre mein Lösungsansatz), da es ja an anderer Stelle richtig ist.

    Ich würde mich sehr über etwas Hilfe/Anmerkungen von Euch freuen! Danke!

    Alexander



  • AlexVision schrieb:

    Nun möchte ich die Liste an eine Combobox übergeben:

    cbxNummer.Items.AddRange(HolePersonenNummer().ToArray());
    

    Was ist HolePersonenNummer? Der vorher gepostete Code? Also (entgegen des Namens) eine Liste von Personen?

    So, nun mein Problem:
    Ich möchte das gleiche in einer anderen Form für den Namen machen und die schon vorhandene Methode (HolePersonenNummer) verwenden.
    Allerdings soll dann die Anzeige in der Combobox Name, Nummer sein.
    Auch wenn ich eine neue Methode schreibe, die zuerst den Namen ausliest erhalte ich in der Anzeige immer Nummer, Name.

    Das liegt vermutlich an der override string ToString() Methode in der Klasse Person?!
    Wie kann ich das Problem lösen, so dass meine Anzeige auf beim Namen wie gewünscht aussieht?

    Den Text per Hand zusammenbasteln, ohne auf ToString (auch implizit) zurückzugreifen.

    cbxNummer.Items.AddRange(HolePersonenNummer().Select(person => string.Format("{0}, {1}", person.Name, person.Nummer)).ToArray())
    


  • Bashar schrieb:

    AlexVision schrieb:

    Nun möchte ich die Liste an eine Combobox übergeben:

    cbxNummer.Items.AddRange(HolePersonenNummer().ToArray());
    

    Was ist HolePersonenNummer? Der vorher gepostete Code? Also (entgegen des Namens) eine Liste von Personen?

    Mit der Methode HolePersonenNummer hole ich die Daten aus der DB und schreibe sie in List<Person>

    ....
    List<Person> person = new List<Person>();
                            while (dr.Read())
                            {
                                person.Add(new Person { Nummer = dr.GetString(0), Name = dr.GetString(1) });
                            }
                            return person;
                        }
    ....
    

    Danke für Deinen Tipp, werde ihn gleich mal testen!



  • Danke Bashar, das klappt so prima!
    Für mein Verständnis - das wird mit Linq umgesetzt?!

    Alexander



  • AlexVision schrieb:

    Mit der Methode HolePersonenNummer hole ich die Daten aus der DB und schreibe sie in List<Person>

    Worauf Bashar hinaus wollte: Wieso heißt die Methode dann HolePersonenNummer?



  • Ja, Select ist eine Extension Method aus System.Linq.Enumerable. Wenn du damit Bauchschmerzen hast, schreib es anders, so ist es halt IMO eleganter als mit einer vorgelagerten Schleife, die erstmal eine Liste von Strings generiert.



  • Wie wird der string dann noch nach dem Namen sortiert?

    Ich habe schon mal gelesen, dass es .Orderby gibt, weiß aber in diesem Zusammenhang nicht wie anwenden.

    Durch die Angabe von => müsste es ja ein so genannter Lambda Ausdruck sein, oder?
    Ist das einfach eine andere Schreibweise von Linq?



  • Also, ich würde mir die Daten ja schon sortiert aus der DB holen, wenn du es allerdings code mässig machen möchtest:

    http://www.dotnetperls.com/sort

    Hier hast du ein paar Beispiele wie man das bei einem Array, mit LINQ und mit List macht.



  • Ich wollte eben die bereits vorhandene Methode HolePersonenNummer (sortiert nach der Nummer) auch zum Füllen für den Namen verwenden, da es ja im Prinzip genau das selbe ist.

    Wäre es nicht sinnvoll, schon vorhandenes zu nutzen?
    Oder anderst gefragt, macht es anhand meines Beispiels mehr Sinn (=besserer Programmierstil), wenn ich eine weitere Methode HolePersonenName (sortiert nach Name) schreibe?



  • Bashar schrieb:

    Den Text per Hand zusammenbasteln, ohne auf ToString (auch implizit) zurückzugreifen.

    cbxNummer.Items.AddRange(HolePersonenNummer().Select(person => string.Format("{0}, {1}", person.Name, person.Nummer)).ToArray())
    

    Oh. Dann hat man ein string[] in der Items-Collection. Das ist für die weitere Verarbeitung i.d.R. keine gute Lösung.

    Lieber die Personen-Objekte in die Items-Collection stecken und per DisplayMember-Property der Combobox steuern, wie die Ausgabe aussehen soll.

    public partial class Form1 : Form
    {
    	public Form1()
    	{
    		InitializeComponent();
    
    		Person p1 = new Person{ Nummer = "1", Name = "Chuck Norris"};
    		Person p2 = new Person { Nummer = "23", Name = "Bruce Lee"};
    
    		comboBox1.Items.Add(p1);
    		comboBox1.Items.Add(p2);
    
    		comboBox1.DisplayMember = "foo";
    	}
    
    	private void button1_Click(object sender, EventArgs e)
    	{
    		comboBox1.DisplayMember = "Name";
    	}
    }
    
    public class Person
    {
    	public string Nummer { get; set; }
    	public string Name { get; set; }
    
    	public string foo
    	{
    		get {return string.Format("({0}.) - {1}", Nummer,Name);}
    	}
    }
    


  • Nein, du solltest auf jedenfall die vorhandene Methode nutzen.

    Um das DB Seitig zu sortieren wäre ein weiterer Parameter (columName) zu verwenden in diese Methode.

    Falls aber lieber codemässig:

    HolePersonenNummer().OrderBy(x => x.Name).toList();

    ich glaube so müsste das aussehen.


Log in to reply