it-swarm.com.de

ComboBox: Hinzufügen von Text und Werten zu einem Element (keine Bindungsquelle)

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"
172
Bohn

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());
}
324
Adam Markowitz
// 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;
176
fab

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;
106
buhtla

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
22
Mert Cingoz

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:

14
Amr Elgarhy

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

12
cronynaval

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);
11
Charles Glisan
//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);
6
Ryan

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

4
Muhammad Ahmad

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;
4
Maggie

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();
3
Soenhay

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.

3
Matheus Rocha

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.

1
Bill Pascoe

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);
    }
1
Jan Staecker

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();
0
Esteban Verbel

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());
0
Orhan Bayram

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;
}
0
Miguel

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.

0
Enigma

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);

        }

    }
}
0
Limitless isa

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.

0
Alex Smith