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
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)
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)
Hi,
ansonsten such einfach mal nach "C# multicolumn combobox" - da gibt es massig Controls insb. auf CodeProject.
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
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)
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
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
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)
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:
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)
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:
- solang du in einer Property nicht mehr machst als eine private Variable zu kapseln, solltest du Auto-Getter/Setter verwenden. Macht die Sache übersichtlicher.
- verzichte auf Unterstriche in Variablennamen. Das ist schlecht lesbar so.
- 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
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:
string first = "hello";
string second = "world";
string combined = $"{first} und irgendwas dazwischen {second}";
string combined = string.Format("{0} und irgendwas dazwischen {1}", first, second);
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)