Laden...

Combobox mit ListView: Wie mache ich eine ComboBox mit zwei Spalten?

Erstellt von samkirchner vor 7 Jahren Letzter Beitrag vor 7 Jahren 2.957 Views
S
samkirchner Themenstarter:in
15 Beiträge seit 2016
vor 7 Jahren
Combobox mit ListView: Wie mache ich eine ComboBox mit zwei Spalten?

Hallo liebe C#´ler,

ich stecke leider fest im Thema Combobox mit 2 Spalten:

Da es laut meiner Recherche sowas nicht gibt, sollte man scheinbar ein ListView in die Combobox packen.

Nu stellt sich mir die Frage ob jmd vlt einen Beispielcode dazu hat, da ich im Inet nichts gefunden habe, was mich weiterbringt.

Sinn und Zweck ist eine Auswahl für Mitarbeiter um seine Arbeitszeit in eine MDB zu schreiben. Leider kann es jetzt ja vorkommen, dass 2 Mitarbeiter Inge Huber heißen, dazu möchte ich gerne noch die ID zusätzlich als Zugriffsvariable haben.

Sicherlich könnte ich das einfach alles in einen String packen und den dann zerlegen, doch das sollte bestimmt ein wenig schöner gehen.

Für eine Hilfe wäre ich sehr dankbar (leider sind meine Englishkenntnisse nicht gerade beraubend, was es wohl schwerer macht 😦 ).

Danke im Voraus

Liebe Grüße

Sam

3.003 Beiträge seit 2006
vor 7 Jahren

Windows Forms oder WPF?

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

S
samkirchner Themenstarter:in
15 Beiträge seit 2016
vor 7 Jahren

Windows Forms

Liebe Grüße

Sam

3.003 Beiträge seit 2006
vor 7 Jahren

Ich sehe da nicht direkt die Notwendigkeit, einen ListView zu benutzen (würde auch gehen).


public partial class Form1 : Form
{
    class Mitarbeiter
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string DisplayName => $"{Name} ({Id})";
    }

    private List<Mitarbeiter> GetMitarbeiterListe()
    {
        return new List<Mitarbeiter>
        {
            new Mitarbeiter { Id = 1, Name = "Ines Böhm" },
            new Mitarbeiter { Id = 2, Name = "Hein Rudolph" },
            new Mitarbeiter { Id = 3, Name = "Ines Böhm" },
        };
    }


    public Form1()
    {
        InitializeComponent();

        List<Mitarbeiter> mitarbeiterListe = GetMitarbeiterListe();
        myComboBox.DataSource = mitarbeiterListe;
        myComboBox.DisplayMember = "DisplayName";
    }
}

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

771 Beiträge seit 2009
vor 7 Jahren

Hi,

ansonsten such einfach mal nach "C# multicolumn combobox" - da gibt es massig Controls insb. auf CodeProject.

S
samkirchner Themenstarter:in
15 Beiträge seit 2016
vor 7 Jahren

Nunja, ich habe zwar keine Klasse Mitarbeiter allerdings stehen meine Daten bereits in einer ArrayList. Die Frage ist nun vielmehr wie ich durch auswahl des Mitarbeiters seine ID erhalte, zumal die Combobox ja nur einen Eintrag "Name" hat.

Liebe Grüße

Sam

3.003 Beiträge seit 2006
vor 7 Jahren

Oje, da fehlt einiges an Grundlagen.

Die Combobox oben ist an Objekte vom Typ Mitarbeiter gebunden. Das heisst, jeder Eintrag der Combobox besteht aus einem Objekt. Jeder Eintrag hat also Namen und ID. Auswerten geht (zum Beispiel) so:


private void myComboBox_SelectedValueChanged(object sender, EventArgs e)
{
    Mitarbeiter selectedMitarbeiter = (Mitarbeiter)myComboBox.SelectedValue;
    MessageBox.Show($"Der Mitarbeiter \"{selectedMitarbeiter.Name}\" wurde ausgewählt. Er hat die ID {selectedMitarbeiter.Id}.");
}

Mit anderen Worten hast du alle Werte, die du brauchst.

[EDIT]Die an die Combobox gebundenen Werte können noch wesentlich komplexer sein als die Mitarbeiter-Klasse oben. Die Combobox stört das nicht - man hat dann jedesmal Zugriff auf jeden beliebigen Wert eines gebundenen Objekts.[/EDIT]

Deine ArrayList ersetzt du besser durch etwas typisiertes. Seitdem generische Collections (List<T>) eingeführt wurden, sollte man ArrayList nicht mehr benutzen. Das war Anfang 2006, also vor etwas mehr als 10 Jahren.

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

S
samkirchner Themenstarter:in
15 Beiträge seit 2016
vor 7 Jahren
  
private void myComboBox_SelectedValueChanged(object sender, EventArgs e)  
{  
    Mitarbeiter selectedMitarbeiter = (Mitarbeiter)myComboBox.SelectedValue;  
    MessageBox.Show($"Der Mitarbeiter \"{selectedMitarbeiter.Name}\" wurde ausgewählt. Er hat die ID {selectedMitarbeiter.Id}.");  
}  
  

Leider bekomme ich hier eine InvalidCastExeption "Zusätzliche Informationen: Das Objekt des Typs "System.Int32" kann nicht in Typ "Hopfengarten.Model.Mitarbeiter" umgewandelt werden" 😦. Allerdings muß ich zugeben, dass mich das verwirrt, da ich wie LaTino empfohlen hat eine Klasse Mitarbeiter erstellt habe. Die Klasse sieht wie folgt aus


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Hopfengarten.Model
{
    class Mitarbeiter
    {
        private int id;
        private string vorname, nachname, name_komplett;

        public Mitarbeiter()
        {
            id = 0;
            vorname = "Max";
            nachname = "Musterman";
        }
                
        public int Id
        {
            get { return id; }
            set { id = value; }
        }
        public string Vorname
        {
            get { return vorname; }
            set { vorname = value; }
        }
        public string Nachname
        {
            get { return nachname; }
            set { nachname = value; }
        }

        public string Name_komplett
        {
            get { return vorname + " " + nachname;}
        }
    }
}

Die Daten in die cb_mitarbeiter (ComboBox) bekomme ich damit:


 cb_mitarbeiter.DataSource = personal_liste;
 cb_mitarbeiter.DisplayMember =  "Name_komplett" ;

beim Zugriff auf das Ereignis bekomme ich dann die Ex


  private void cb_mitarbeiter_SelectedValueChanged(object sender, EventArgs e)
        {
            Mitarbeiter worker = (Mitarbeiter)cb_mitarbeiter.SelectedValue; // hier taucht der Fehler auf
            id = worker.Id;
            name = worker.Name_komplett;
               
           
        }

Woran könnte das denn liegen?

Edit: Also das ich einen falschen Datentyp habe, ist mir bewusst, die Frage ist nur wieso und welcher, zumal ich nur die Id als int (primary Key) habe. Da ich jedoch ein ganzes Objekt in der ComboBox hinterlege und dies wiederum einer Instanz zuweise, stehe ich echt vorm Wald 😦.

Liebe Grüße

Sam

4.939 Beiträge seit 2008
vor 7 Jahren

Probiere mal SelectedItem 😉

Du hast wahrscheinlich


cb_mitarbeiter.ValueMember = "Id";

gesetzt, oder? Und dann erhältst du mit SelectedValue eben genau diese Id.

PS: Und Umwandeln solltest du besser mit 'as', s.a. [FAQ] Casten aber richtig: () / is / as

3.003 Beiträge seit 2006
vor 7 Jahren

PS: Und Umwandeln solltest du besser mit 'as', s.a.
>

In diesem Fall nicht. Es soll knallen, wenn der Cast nicht hinhaut. Dann hat man das databinding verhauen....ich hatte den harten Cast schon mit Hintergedanken da drin 😃

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

3.003 Beiträge seit 2006
vor 7 Jahren

Doppelpost, weil ich gestern abend nur mit Handy unterwegs war und nach paar Versuchen aufgegeben habe 😃

Woran könnte das denn liegen?

Das kannst du relativ schnell selbst rausfinden. Setz einen Breakpoint (F9 drücken) auf folgende Zeile:


Mitarbeiter worker = (Mitarbeiter)cb_mitarbeiter.SelectedValue; // hier taucht der Fehler auf

Debugge dein Programm (F5). Sobald der Programmablauf an der besagten Stelle ankommt, wird er unterbrochen. Geh jetzt mit der Maus über cb_mitarbeiter.SelectedValue und schau dir an, was drin steht. Du kannst auch im "Überwachen"-Fenster, das irgendwo am unteren Bildschirmrand sein müsste, cb_mitarbeiter.SelectedValue.GetType() eintragen und direkt schauen, was für Objekte in deiner Combobox gehalten werden. Wenn es nicht der Typ Mitarbeiter ist - und das ist er nicht - steht dort zumindest, was es ist. Daran solltest du erkennen können, an welcher Stelle du der ComboBox die falschen Daten als DataSource übergeben hast.

(Ich tippe darauf, dass du an irgendeiner Stelle noch Items von Hand reinkippst.)

S.a.: [Artikel] Debugger: Wie verwende ich den von Visual Studio?

Noch ein paar Anmerkungen, die nichts mit dem Problem zu tun haben:

  1. solang du in einer Property nicht mehr machst als eine private Variable zu kapseln, solltest du Auto-Getter/Setter verwenden. Macht die Sache übersichtlicher.
  2. verzichte auf Unterstriche in Variablennamen. Das ist schlecht lesbar so.
  3. gewöhn dir ab, Zeichenketten mit "+" zu verketten. Das kann einem gewaltig auf die Füße fallen (nicht in diesem Fall, aber man gewöhnt sich besser nicht erst dran.)

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

S
samkirchner Themenstarter:in
15 Beiträge seit 2016
vor 7 Jahren

Guten Morgen 😃,

Du hast wahrscheinlich

  
cb_mitarbeiter.ValueMember = "Id";  
  

gesetzt, oder?

Hm, ich habe wohl gestern in der Verzweiflung einiges versucht bzw. verstellt trifft es glaub besser ^^.

Ich habe nun die Eigenschaften wieder zurückgestellt und siehe da es kommt kein Fehler mehr 😃. Naja, was soll ich sagen, alles noch ein wenig verwirrend.

(Ich tippe darauf, dass du an irgendeiner Stelle noch Items von Hand reinkippst.)

danke für den Tipp, um ganz ehrlich zu sein habe ich an die Veränderungen per Hand nicht mehr gedacht, doch daran lag es 😃.

Noch ein paar Anmerkungen, die nichts mit dem Problem zu tun haben:

  1. solang du in einer Property nicht mehr machst als eine private Variable zu kapseln, solltest du Auto-Getter/Setter verwenden. Macht die Sache übersichtlicher.
  2. verzichte auf Unterstriche in Variablennamen. Das ist schlecht lesbar so.
  3. gewöhn dir ab, Zeichenketten mit "+" zu verketten. Das kann einem gewaltig auf die Füße fallen (nicht in diesem Fall, aber man gewöhnt sich besser nicht erst dran.)

Danke für die Tipps 😃. Allerdings habe ich dazu noch eine Frage zu Punkt 3. Wie soll ich Zeichenketten dann verketten?

Vielen Dank an LaTino & Th69 für die schnelle freundliche Hilfe 😃.

Liebe Grüße

Sam

3.003 Beiträge seit 2006
vor 7 Jahren

Wie soll ich Zeichenketten dann verketten?

Ich bin mir nicht ganz sicher, meine aber, dazu gibt es hier im Forum einen Artikel. Falls nicht, hier die Kurzfassung:

  • einfache Verkettung in Visual Studio 2015 oder höher (C# 6.0)

string first = "hello";
string second = "world";

string combined = $"{first} und irgendwas dazwischen {second}";

  • einfache Verkettung in C# < 6

string combined = string.Format("{0} und irgendwas dazwischen {1}", first, second);

  • insb. in Schleifen:

StringBuilder sb = new StringBuilder();
for(int i = 0; i < 1000000; i++)
{
    sb.AppendLine("blubb");
}

string result = sb.ToString();

Du kannst auch mit "+" verketten, insbesondere in Schleifen ist das aber eine potenzielle Fallgrube. Daher sollte man gerade als Anfänger bewusst die Alternativen wählen (nicht jede Schleife ist sofort als Schleife erkennbar...).

LaTino

"Furlow, is it always about money?"
"Is there anything else? I mean, how much sex can you have?"
"Don't know. I haven't maxed out yet."
(Furlow & Crichton, Farscape)

1.040 Beiträge seit 2007
vor 7 Jahren