Wie kann ich in C # WinApp den Elementen meiner ComboBox sowohl Text als auch Wert hinzufügen? Ich habe eine Suche durchgeführt und die Antworten verwenden normalerweise "Bindung an eine Quelle" Quelle fertig in meinem Programm ..... Wie kann ich so etwas tun:
combo1.Item[1] = "DisplayText";
combo1.Item[1].Value = "useful Value"
Sie müssen Ihren eigenen Klassentyp erstellen und die ToString () -Methode überschreiben, um den gewünschten Text zurückzugeben. Hier ist ein einfaches Beispiel für eine Klasse, die Sie verwenden können:
public class ComboboxItem
{
public string Text { get; set; }
public object Value { get; set; }
public override string ToString()
{
return Text;
}
}
Das folgende ist ein einfaches Beispiel für seine Verwendung:
private void Test()
{
ComboboxItem item = new ComboboxItem();
item.Text = "Item text1";
item.Value = 12;
comboBox1.Items.Add(item);
comboBox1.SelectedIndex = 0;
MessageBox.Show((comboBox1.SelectedItem as ComboboxItem).Value.ToString());
}
// Bind combobox to dictionary
Dictionary<string, string>test = new Dictionary<string, string>();
test.Add("1", "dfdfdf");
test.Add("2", "dfdfdf");
test.Add("3", "dfdfdf");
comboBox1.DataSource = new BindingSource(test, null);
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";
// Get combobox selection (in handler)
string value = ((KeyValuePair<string, string>)comboBox1.SelectedItem).Value;
Sie können anonyme Klasse wie folgt verwenden:
comboBox.DisplayMember = "Text";
comboBox.ValueMember = "Value";
comboBox.Items.Add(new { Text = "report A", Value = "reportA" });
comboBox.Items.Add(new { Text = "report B", Value = "reportB" });
comboBox.Items.Add(new { Text = "report C", Value = "reportC" });
comboBox.Items.Add(new { Text = "report D", Value = "reportD" });
comboBox.Items.Add(new { Text = "report E", Value = "reportE" });
UPDATE: Obwohl der obige Code korrekt im Kombinationsfeld angezeigt wird, können Sie die Eigenschaften SelectedValue
oder SelectedText
von ComboBox
nicht verwenden. Um diese verwenden zu können, binden Sie das Kombinationsfeld wie folgt:
comboBox.DisplayMember = "Text";
comboBox.ValueMember = "Value";
var items = new[] {
new { Text = "report A", Value = "reportA" },
new { Text = "report B", Value = "reportB" },
new { Text = "report C", Value = "reportC" },
new { Text = "report D", Value = "reportD" },
new { Text = "report E", Value = "reportE" }
};
comboBox.DataSource = items;
Sie sollten dynamic
object verwenden, um das Combobox-Element zur Laufzeit aufzulösen.
comboBox.DisplayMember = "Text";
comboBox.ValueMember = "Value";
comboBox.Items.Add(new { Text = "Text", Value = "Value" });
(comboBox.SelectedItem as dynamic).Value
Dies ist eine der Möglichkeiten, die mir gerade in den Sinn gekommen sind:
combo1.Items.Add(new ListItem("Text", "Value"))
Und um den Text oder den Wert eines Elements zu ändern, können Sie dies folgendermaßen tun:
combo1.Items[0].Text = 'new Text';
combo1.Items[0].Value = 'new Value';
Es gibt keine Klasse namens ListItem in Windows Forms . Es existiert nur in ASP.NET , daher müssen Sie Ihre eigene Klasse schreiben, bevor Sie es verwenden können, genau wie @Adam Markowitz in seine Antwort .
Überprüfen Sie auch diese Seiten, sie können helfen:
Sie können Dictionary
Object verwenden, anstatt eine benutzerdefinierte Klasse zum Hinzufügen von Text und Werten in einer Combobox
zu erstellen.
Fügen Sie Schlüssel und Werte in einem Dictionary
-Objekt hinzu:
Dictionary<string, string> comboSource = new Dictionary<string, string>();
comboSource.Add("1", "Sunday");
comboSource.Add("2", "Monday");
Binden Sie das Quell-Dictionary-Objekt an Combobox
:
comboBox1.DataSource = new BindingSource(comboSource, null);
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";
Schlüssel und Wert abrufen:
string key = ((KeyValuePair<string,string>)comboBox1.SelectedItem).Key;
string value = ((KeyValuePair<string,string>)comboBox1.SelectedItem).Value;
Vollständige Quelle: Combobox Text und Wert
Ich weiß nicht, ob dies für die im ursprünglichen Beitrag angegebene Situation funktionieren wird (egal, dass dies zwei Jahre später ist), aber dieses Beispiel funktioniert für mich:
Hashtable htImageTypes = new Hashtable();
htImageTypes.Add("JPEG", "*.jpg");
htImageTypes.Add("GIF", "*.gif");
htImageTypes.Add("BMP", "*.bmp");
foreach (DictionaryEntry ImageType in htImageTypes)
{
cmbImageType.Items.Add(ImageType);
}
cmbImageType.DisplayMember = "key";
cmbImageType.ValueMember = "value";
Um Ihren Wert erneut auszulesen, müssen Sie die SelectedItem-Eigenschaft in ein DictionaryEntry-Objekt umwandeln. Anschließend können Sie die Key- und Value-Eigenschaften dieses Objekts auswerten. Zum Beispiel:
DictionaryEntry deImgType = (DictionaryEntry)cmbImageType.SelectedItem;
MessageBox.Show(deImgType.Key + ": " + deImgType.Value);
//set
comboBox1.DisplayMember = "Value";
//to add
comboBox1.Items.Add(new KeyValuePair("2", "This text is displayed"));
//to access the 'tag' property
string tag = ((KeyValuePair< string, string >)comboBox1.SelectedItem).Key;
MessageBox.Show(tag);
Sie können diesen Code Kombinationselement mit Text und dessen Wert hinzufügen
private void ComboBox_SelectionChanged_1(object sender, SelectionChangedEventArgs e)
{
combox.Items.Insert(0, "Copenhagen");
combox.Items.Insert(1, "Tokyo");
combox.Items.Insert(2, "Japan");
combox.Items.Insert(0, "India");
}
einfügen einiger Elemente in combox mit Text und Wert . und hier dessen xaml-Code für combox
Ich mochte die Antwort von fab, wollte aber kein Wörterbuch für meine Situation verwenden, also ersetzte ich eine Liste von Tupeln.
// set up your data
public static List<Tuple<string, string>> List = new List<Tuple<string, string>>
{
new Tuple<string, string>("Item1", "Item2")
}
// bind to the combo box
comboBox.DataSource = new BindingSource(List, null);
comboBox.ValueMember = "Item1";
comboBox.DisplayMember = "Item2";
//Get selected value
string value = ((Tuple<string, string>)queryList.SelectedItem).Item1;
Ein Beispiel mit DataTable:
DataTable dtblDataSource = new DataTable();
dtblDataSource.Columns.Add("DisplayMember");
dtblDataSource.Columns.Add("ValueMember");
dtblDataSource.Columns.Add("AdditionalInfo");
dtblDataSource.Rows.Add("Item 1", 1, "something useful 1");
dtblDataSource.Rows.Add("Item 2", 2, "something useful 2");
dtblDataSource.Rows.Add("Item 3", 3, "something useful 3");
combo1.Items.Clear();
combo1.DataSource = dtblDataSource;
combo1.DisplayMember = "DisplayMember";
combo1.ValueMember = "ValueMember";
//Get additional info
foreach (DataRowView drv in combo1.Items)
{
string strAdditionalInfo = drv["AdditionalInfo"].ToString();
}
//Get additional info for selected item
string strAdditionalInfo = (combo1.SelectedItem as DataRowView)["AdditionalInfo"].ToString();
//Get selected value
string strSelectedValue = combo1.SelectedValue.ToString();
Wenn sich noch jemand für dieses Thema interessiert, finden Sie hier eine einfache und flexible Klasse für einen Combobox-Artikel mit einem Text und einem beliebigen Wert (sehr ähnlich dem Beispiel von Adam Markowitz):
public class ComboBoxItem<T>
{
public string Name;
public T value = default(T);
public ComboBoxItem(string Name, T value)
{
this.Name = Name;
this.value = value;
}
public override string ToString()
{
return Name;
}
}
Die Verwendung von <T>
ist besser, als die value
als object
zu deklarieren, denn mit object
müssten Sie den Typ, den Sie für jedes Element verwendet haben, nachverfolgen und ihn in Ihren Code umwandeln, damit er korrekt verwendet wird.
Ich benutze es schon lange in meinen Projekten. Das ist sehr praktisch.
Neben der Antwort von Adam Markowitz, gibt es einen allgemeinen Zweck, die ItemSource
Werte einer Combobox (relativ) einfach auf enums
zu setzen, während dem Benutzer das Attribut 'Description' angezeigt wird. (Sie würden denken, dass jeder dies tun möchte, so dass es ein .NET one-Liner wäre, aber es ist einfach nicht so, und dies ist die eleganteste Art, die ich gefunden habe).
Erstellen Sie zunächst diese einfache Klasse zum Konvertieren eines beliebigen Enum-Werts in ein ComboBox-Element:
public class ComboEnumItem {
public string Text { get; set; }
public object Value { get; set; }
public ComboEnumItem(Enum originalEnum)
{
this.Value = originalEnum;
this.Text = this.ToString();
}
public string ToString()
{
FieldInfo field = Value.GetType().GetField(Value.ToString());
DescriptionAttribute attribute = Attribute.GetCustomAttribute(field, typeof(DescriptionAttribute)) as DescriptionAttribute;
return attribute == null ? Value.ToString() : attribute.Description;
}
}
Zweitens müssen Sie in Ihrem OnLoad
Ereignishandler die Quelle Ihres Kombinationsfelds als Liste von ComboEnumItems
festlegen, die auf jedem Enum
Typ in Ihrem Enum
Typ basiert. Dies kann mit Linq erreicht werden. Dann setzen Sie einfach die DisplayMemberPath
:
void OnLoad(object sender, RoutedEventArgs e)
{
comboBoxUserReadable.ItemsSource = Enum.GetValues(typeof(EMyEnum))
.Cast<EMyEnum>()
.Select(v => new ComboEnumItem(v))
.ToList();
comboBoxUserReadable.DisplayMemberPath = "Text";
comboBoxUserReadable.SelectedValuePath= "Value";
}
Nun wird der Benutzer aus einer Liste Ihrer benutzerfreundlichen Option Descriptions
auswählen, aber der von Ihnen ausgewählte Wert ist enum
, den Sie im Code verwenden können .. Um Zugriff auf die Auswahl des Benutzers im Code zu erhalten, comboBoxUserReadable.SelectedItem
wird die ComboEnumItem
und comboBoxUserReadable.SelectedValue
die EMyEnum
sein.
Sie können einen generischen Typ verwenden:
public class ComboBoxItem<T>
{
private string Text { get; set; }
public T Value { get; set; }
public override string ToString()
{
return Text;
}
public ComboBoxItem(string text, T value)
{
Text = text;
Value = value;
}
}
Beispiel für die Verwendung eines einfachen int-Type:
private void Fill(ComboBox comboBox)
{
comboBox.Items.Clear();
object[] list =
{
new ComboBoxItem<int>("Architekt", 1),
new ComboBoxItem<int>("Bauträger", 2),
new ComboBoxItem<int>("Fachbetrieb/Installateur", 3),
new ComboBoxItem<int>("GC-Haus", 5),
new ComboBoxItem<int>("Ingenieur-/Planungsbüro", 9),
new ComboBoxItem<int>("Wowi", 17),
new ComboBoxItem<int>("Endverbraucher", 19)
};
comboBox.Items.AddRange(list);
}
Dies ist eine sehr einfache Lösung für Windows-Formulare, wenn nur der letzte Wert als (Zeichenfolge) erforderlich ist. Die Namen der Elemente werden in der Combo-Box angezeigt und der ausgewählte Wert kann leicht verglichen werden.
List<string> items = new List<string>();
// populate list with test strings
for (int i = 0; i < 100; i++)
items.Add(i.ToString());
// set data source
testComboBox.DataSource = items;
und im Event-Handler den Wert (String) des ausgewählten Werts erhalten
string test = testComboBox.SelectedValue.ToString();
Bessere Lösung hier;
Dictionary<int, string> userListDictionary = new Dictionary<int, string>();
foreach (var user in users)
{
userListDictionary.Add(user.Id,user.Name);
}
cmbUser.DataSource = new BindingSource(userListDictionary, null);
cmbUser.DisplayMember = "Value";
cmbUser.ValueMember = "Key";
Daten abrufen
MessageBox.Show(cmbUser.SelectedValue.ToString());
Ich hatte das gleiche Problem, was ich tat, war das Hinzufügen einer neuen ComboBox
mit nur dem Wert im selben Index als dem ersten, und wenn ich dann die Principal-Combo ändere, ändert sich der Index in der zweiten gleichzeitig, und dann nehme ich das Wert der zweiten Kombination und verwenden Sie es.
Dies ist der Code:
public Form1()
{
eventos = cliente.GetEventsTypes(usuario);
foreach (EventNo no in eventos)
{
cboEventos.Items.Add(no.eventno.ToString() + "--" +no.description.ToString());
cboEventos2.Items.Add(no.eventno.ToString());
}
}
private void lista_SelectedIndexChanged(object sender, EventArgs e)
{
lista2.Items.Add(lista.SelectedItem.ToString());
}
private void cboEventos_SelectedIndexChanged(object sender, EventArgs e)
{
cboEventos2.SelectedIndex = cboEventos.SelectedIndex;
}
So macht es Visual Studio 2013:
Einzelexemplar:
comboBox1->Items->AddRange(gcnew cli::array< System::Object^ >(1) { L"Combo Item 1" });
Mehrere Artikel:
comboBox1->Items->AddRange(gcnew cli::array< System::Object^ >(3)
{
L"Combo Item 1",
L"Combo Item 2",
L"Combo Item 3"
});
Sie müssen keine Klassenüberschreibungen durchführen oder andere Elemente hinzufügen. Und ja, die Aufrufe comboBox1->SelectedItem
und comboBox1->SelectedIndex
funktionieren immer noch.
Klassenerstellung:
namespace WindowsFormsApplication1
{
class select
{
public string Text { get; set; }
public string Value { get; set; }
}
}
Form1-Codes:
namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
List<select> sl = new List<select>();
sl.Add(new select() { Text = "", Value = "" });
sl.Add(new select() { Text = "AAA", Value = "aa" });
sl.Add(new select() { Text = "BBB", Value = "bb" });
comboBox1.DataSource = sl;
comboBox1.DisplayMember = "Text";
}
private void comboBox1_SelectedIndexChanged(object sender, EventArgs e)
{
select sl1 = comboBox1.SelectedItem as select;
t1.Text = Convert.ToString(sl1.Value);
}
}
}
Dies ähnelt einigen anderen Antworten, ist aber kompakt und vermeidet die Umwandlung in ein Wörterbuch, wenn Sie bereits über eine Liste verfügen.
Wenn eine ComboBox
"Kombinationsbox" in einem Windows-Formular und eine Klasse SomeClass
mit der Eigenschaft string
des Typs Name
angegeben ist,
List<SomeClass> list = new List<SomeClass>();
combobox.DisplayMember = "Name";
combobox.DataSource = list;
Dies bedeutet, dass das SelectedItem ein SomeClass
-Objekt von list
ist und jedes Element in combobox
mit seinem Namen angezeigt wird.