ComboBox: การเพิ่มข้อความและความคุ้มค่าให้กับรายการ (ไม่มีแหล่งผูกพัน)


202

ใน C # WinApp ฉันจะเพิ่มทั้งข้อความและค่าในรายการ ComboBox ของฉันได้อย่างไร ฉันค้นหาแล้วมักจะใช้คำตอบ "ผูกกับแหล่งที่มา" .. แต่ในกรณีของฉันฉันไม่มีแหล่งรวมที่พร้อมในโปรแกรมของฉัน ... ฉันจะทำสิ่งนี้:

combo1.Item[1] = "DisplayText";
combo1.Item[1].Value = "useful Value"

คำตอบ:


361

คุณต้องสร้างประเภทชั้นเรียนของคุณเองและแทนที่เมธอด ToString () เพื่อส่งคืนข้อความที่คุณต้องการ นี่เป็นตัวอย่างง่ายๆของคลาสที่คุณสามารถใช้:

public class ComboboxItem
{
    public string Text { get; set; }
    public object Value { get; set; }

    public override string ToString()
    {
        return Text;
    }
}

ต่อไปนี้เป็นตัวอย่างง่ายๆของการใช้งาน:

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

4
เราต้องการจริงๆ ComboboxItem คลาสใหม่นี้หรือไม่? ฉันคิดว่ามีอยู่แล้วเรียกว่า ListItem
Amr Elgarhy

15
ฉันเชื่อว่าอาจมีเฉพาะใน ASP.NET และไม่ใช่ WinForms
Adam Markowitz

1
ไม่รายการเป็นประเภทแยกต่างหากที่ใช้สำหรับเก็บข้อมูลของรายการเท่านั้น (ข้อความค่าอ้างอิงถึงวัตถุอื่น ฯลฯ ) มันไม่ใช่ลูกหลานของ ComboBox และมันจะยากมากที่มันจะเป็น
Adam Markowitz

1
ฉันรู้ว่าฉันค่อนข้างช้าไปงานปาร์ตี้ แต่วิธีที่ฉันทำในสภาพแวดล้อมแบบหน้าต่างที่บริสุทธิ์นั้นคือการตั้งค่าดาต้าดาต้าเพิ่มไอเท็มลงไปและผูกคอมโบกับเดต้าได้ หนึ่งคิดว่าควรมีวิธีที่สะอาดกว่าการทำ แต่ฉันไม่พบหนึ่ง (DisplayMember เป็นคุณสมบัติใน combobox ที่คุณต้องการสำหรับข้อความที่ปรากฏข้อความ ValueMember สำหรับมูลค่าของข้อมูล)
user2366842

4
เราจะได้รับ "SelectedValue" หรือเลือกรายการตามมูลค่า ... ได้อย่างไรโปรดตอบ
Alpha Gabriel V. Timbol

185
// 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;

2
ทำงานได้สมบูรณ์แบบและนี่ควรเป็นคำตอบที่เลือก แต่เราไม่สามารถใช้ comboBox1.SelectedText แทนการคัดเลือกคัดเลือกและทำรายการ
Jeffrey Goines

@fab คุณจะค้นหารายการในคอมโบด้วยกุญแจได้อย่างไร
สมิ ธ

เป็นไปได้หรือไม่ที่จะเลือกรายการใดรายการหนึ่งในคอมโบบ็อกซ์จากรหัสพจนานุกรม? เช่นเลือกคีย์ 3 ดังนั้นไอเท็มที่มีคีย์ 3 จะถูกเลือก
Dror

วิธีนี้ใช้ไม่ได้กับ vs2015 ข้อยกเว้นที่เกิดขึ้นเกี่ยวกับการไม่สามารถผูกมัดกับหน้าจอสมาชิกใหม่และ Valuemember ใหม่
Plater

119

คุณสามารถใช้คลาสไม่ระบุชื่อเช่นนี้:

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:แม้ว่าโค้ดข้างต้นอย่างถูกต้องจะแสดงในกล่องคำสั่งผสมคุณจะไม่สามารถที่จะใช้งานSelectedValueหรือคุณสมบัติของSelectedText ComboBoxเพื่อให้สามารถใช้งานได้ให้ผูกกล่องคำสั่งผสมดังต่อไปนี้:

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;

14
ฉันต้องการแก้ไขสิ่งนี้เล็กน้อยเนื่องจากโปรแกรมเมอร์น่าจะต้องใช้ลูปพร้อมกับสิ่งนี้ แทนที่จะเป็นอาร์เรย์ฉันใช้รายการList<Object> items = new List<Object>(); จากนั้นฉันก็สามารถใช้วิธีการitems.Add( new { Text = "report A", Value = "reportA" } );ภายในลูปได้
Andrew

1
แอนดรูคุณได้รับรายการ <Object> เพื่อทำงานกับคุณสมบัติ SelectedValue หรือไม่
Peter PitLock

@Venkat,comboBox.SelectedItem.GetType().GetProperty("Value").GetValue(comboBox.SelectedItem, null)
Optavius

2
@Venkat หากคุณใช้โซลูชันที่สองที่ตั้งค่าDataSourceคุณสามารถใช้SelectedValueหรือSelectedTextคุณสมบัติของคอมโบบ็อกซ์ได้ดังนั้นจึงไม่จำเป็นต้องทำการคัดเลือกนักแสดงพิเศษ
JPProgrammer

32

คุณควรใช้dynamicวัตถุเพื่อแก้ไขรายการ combobox ในเวลาทำงาน

comboBox.DisplayMember = "Text";
comboBox.ValueMember = "Value";

comboBox.Items.Add(new { Text = "Text", Value = "Value" });

(comboBox.SelectedItem as dynamic).Value

1
นี่ดีกว่าการสร้างคลาสที่แยกต่างหากและการเอาชนะ ToString ()
Don Shrout

1
แบบไดนามิกใช้ได้เฉพาะใน C # 4 และสูงกว่า (.NET 4.5 ฉันคิดว่า)
MickeyfAgain_BeforeExitOfSO

ง่ายและเร็วในการเขียน! ฉันทำสิ่งนี้สำหรับ SelectedValue ใน VB.net: Dim Value As String = CType (Me.SectionIDToComboBox.SelectedItem, Object) .Value
Hannington Mambo

1
วิธีการตั้งค่ารายการคำสั่งผสมที่ถูกต้องโดยใช้ "ค่า"?
Dave Ludwig

17

คุณสามารถใช้วัตถุแทนการสร้างระดับที่กำหนดเองสำหรับการเพิ่มข้อความและความคุ้มค่าในDictionaryCombobox

เพิ่มคีย์และค่าในDictionaryวัตถุ:

Dictionary<string, string> comboSource = new Dictionary<string, string>();
comboSource.Add("1", "Sunday");
comboSource.Add("2", "Monday");

ผูกออบเจ็กต์พจนานุกรมต้นทางไปที่Combobox:

comboBox1.DataSource = new BindingSource(comboSource, null);
comboBox1.DisplayMember = "Value";
comboBox1.ValueMember = "Key";

ดึงข้อมูลคีย์และค่า:

string key = ((KeyValuePair<string,string>)comboBox1.SelectedItem).Key;
string value = ((KeyValuePair<string,string>)comboBox1.SelectedItem).Value;

ที่มาแบบเต็ม: ข้อความและค่า Combobox


14

นี่คือวิธีหนึ่งที่เพิ่งนึกได้:

combo1.Items.Add(new ListItem("Text", "Value"))

และในการเปลี่ยนข้อความหรือมูลค่าของรายการคุณสามารถทำได้ดังนี้

combo1.Items[0].Text = 'new Text';

combo1.Items[0].Value = 'new Value';

มีระดับที่เรียกว่าไม่มี ListItem ในเป็นแบบฟอร์ม Windows มันมีอยู่ในASP.NETดังนั้นคุณจะต้องเขียนระดับของคุณเองก่อนที่จะใช้เช่นเดียวกับ @Adam Markowitz ได้ในคำตอบของเขา

ตรวจสอบหน้าเหล่านี้ด้วยซึ่งอาจช่วย:


2
ยกเว้นว่าฉันเข้าใจผิด ListItem จะใช้ได้เฉพาะใน ASP.NET
Adam Markowitz

ใช่ :( น่าเสียดายที่มันมีเฉพาะใน ASP.net ... ดังนั้นฉันจะทำอย่างไรตอนนี้
Bohn

ถ้าเช่นนั้นคุณสมบัติของ SelectedValue หรือ SelectedText ใน combobox คืออะไร?
JSON

11

ไม่ทราบว่าสิ่งนี้จะใช้ได้กับสถานการณ์ที่ให้ไว้ในโพสต์ดั้งเดิมหรือไม่ (ไม่ต้องสนใจความจริงที่ว่านี่เป็นสองปีต่อมา) แต่ตัวอย่างนี้ใช้ได้สำหรับฉัน:

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

ในการอ่านค่าของคุณกลับมาคุณจะต้องโยนคุณสมบัติ SelectedItem ไปที่วัตถุ DictionaryEntry จากนั้นคุณสามารถประเมินคุณสมบัติของ Key และ Value ของมันได้ ตัวอย่างเช่น

DictionaryEntry deImgType = (DictionaryEntry)cmbImageType.SelectedItem;
MessageBox.Show(deImgType.Key + ": " + deImgType.Value);

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

5

หากใครยังสนใจในเรื่องนี้ต่อไปนี้เป็นคลาสที่ง่ายและยืดหยุ่นสำหรับรายการคอมโบบ็อกซ์พร้อมข้อความและค่าทุกประเภท (คล้ายกับตัวอย่างของ 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;
    }
}

การใช้<T>ดีกว่าการประกาศvalueเป็นobjectเพราะobjectคุณต้องติดตามประเภทที่คุณใช้สำหรับแต่ละรายการและใช้รหัสในการใช้อย่างถูกต้อง

ฉันใช้มันในโครงการของฉันมาระยะหนึ่งแล้ว มันมีประโยชน์จริงๆ


4

ฉันชอบคำตอบของ fab แต่ไม่ต้องการใช้พจนานุกรมสำหรับสถานการณ์ของฉันดังนั้นฉันจึงแทนที่รายการของ tuples

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

3

ตัวอย่างการใช้ 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

คุณสามารถใช้รหัสนี้เพื่อแทรกบางรายการในกล่องคำสั่งผสมด้วยข้อความและค่า

ค#

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

XAML

<ComboBox x:Name="combox" SelectionChanged="ComboBox_SelectionChanged_1"/>

กรุณาอธิบายวิธีการแก้ปัญหาของคุณ
Vaibhav Bajaj

เพียงแค่เพิ่มประเทศต่อไปนี้ในดัชนีของพวกเขาใน combox เมื่อคุณเรียกใช้ Combox ปรากฏขึ้นพร้อมตัวเลือกซึ่งอยู่ที่ 0 ดัชนีหากคุณคลิก Combox ตัวเลือกอื่น ๆ ต่อไปนี้จะแสดง
Muhammad Ahmad

นี้ไม่ได้ทำงานสำหรับ ID นี้เป็นเพียงวิธีการจัดทำดัชนีรายการที่ไม่ว่าคำถามที่เกี่ยวกับ
นาย Heelis

2

นอกเหนือจากคำตอบของ Adam Markowitz ที่นี่เป็นวิธีการทั่วไปของ (ค่อนข้าง) เพียงแค่ตั้งItemSourceค่าของ combobox ให้เป็นenumsในขณะที่แสดงคุณลักษณะ 'คำอธิบาย' ให้กับผู้ใช้ (คุณคิดว่าทุกคนต้องการทำเช่นนี้เพื่อให้เป็น. NETซับเดียว แต่มันไม่ใช่และนี่คือวิธีที่หรูหราที่สุดที่ฉันพบ)

ขั้นแรกให้สร้างคลาสแบบง่าย ๆ นี้เพื่อแปลงค่า Enum ใด ๆ ให้เป็นรายการ ComboBox:

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

ประการที่สองในOnLoadตัวจัดการเหตุการณ์ของคุณคุณต้องตั้งค่าแหล่งที่มาของกล่องคำสั่งผสมของคุณให้เป็นรายการที่ComboEnumItemsขึ้นอยู่กับทุกประเภทEnumของคุณ Enumสามารถทำได้ด้วย Linq จากนั้นเพียงตั้งค่า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";
    }

ตอนนี้ผู้ใช้จะเลือกจากรายการที่เป็นมิตรกับผู้ใช้ของคุณDescriptionsแต่สิ่งที่พวกเขาเลือกจะเป็นenumค่าที่คุณสามารถใช้ในรหัส ในการเข้าถึงตัวเลือกของผู้ใช้ในรหัสที่comboBoxUserReadable.SelectedItemจะเป็นComboEnumItemและจะเป็นcomboBoxUserReadable.SelectedValueEMyEnum


1

คุณสามารถใช้ประเภททั่วไป:

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

ตัวอย่างการใช้ 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);
    }

0

ฉันมีปัญหาเดียวกันสิ่งที่ฉันได้เพิ่มใหม่ComboBoxมีเพียงค่าในดัชนีเดียวกันจากนั้นเป็นครั้งแรกและจากนั้นเมื่อฉันเปลี่ยนคำสั่งผสมหลักดัชนีในการเปลี่ยนแปลงครั้งที่สองในเวลาเดียวกันจากนั้นฉันก็เอาค่า ของคอมโบที่สองและใช้มัน

นี่คือรหัส:

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

โฆษณาระดับ:

namespace WindowsFormsApplication1
{
    class select
    {
        public string Text { get; set; }
        public string Value { get; set; }
    }
}

รหัส Form1:

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

นี่คือวิธีที่ Visual Studio 2013 ทำ:

รายการเดียว:

comboBox1->Items->AddRange(gcnew cli::array< System::Object^  >(1) { L"Combo Item 1" });

หลายรายการ:

comboBox1->Items->AddRange(gcnew cli::array< System::Object^  >(3)
{
    L"Combo Item 1",
    L"Combo Item 2",
    L"Combo Item 3"
});

ไม่จำเป็นต้องทำการแทนที่ชั้นเรียนหรือรวมสิ่งอื่นใด และใช่comboBox1->SelectedItemและการcomboBox1->SelectedIndexโทรยังคงทำงานอยู่


0

นี่คล้ายกับคำตอบอื่น ๆ แต่มีขนาดกะทัดรัดและหลีกเลี่ยงการแปลงเป็นพจนานุกรมหากคุณมีรายการอยู่แล้ว

ได้รับComboBox"ComboBox" ในรูปแบบหน้าต่างและชั้นเรียนSomeClassกับstringประเภทคุณสมบัติName,

List<SomeClass> list = new List<SomeClass>();

combobox.DisplayMember = "Name";
combobox.DataSource = list;

ซึ่งหมายความว่า SelectedItem เป็นSomeClassวัตถุจากlistและแต่ละรายการในcomboboxจะปรากฏขึ้นโดยใช้ชื่อของมัน


ความจริง! ฉันเคยใช้มาDisplayMemberก่อน ... ฉันมักจะลืมไปว่ามันมีอยู่ ฉันคุ้นเคยกับวิธีแก้ปัญหาที่พบก่อนที่จะให้ความสนใจกับคุณสมบัตินี้ แต่ก็ไม่ได้ช่วยอะไร ไม่ใช่คลาสทั้งหมดที่มีNameหรือTagคุณสมบัติหรือมีคุณสมบัติสตริงที่สามารถใช้โดยพลการเป็นข้อความที่แสดง
Matheus Rocha

นี่เป็นจุดที่ดี ถ้าคุณสามารถแก้ไขคลาสได้มันอาจคุ้มค่าที่จะเพิ่มคุณสมบัติดังกล่าวให้กับคลาสตัวอย่างเช่นคุณสมบัติ 'ComboBoxText' (ซึ่งสามารถส่งคืนเมธอด ToString () หากมี) อีกวิธีหนึ่งถ้าคลาสไม่สามารถแก้ไขได้อาจเป็นไปได้ที่จะสร้างคลาสที่ได้รับซึ่งคุณสมบัติ 'ComboBoxText' สามารถนำไปใช้งานได้ สิ่งนี้จะคุ้มค่าถ้าคุณต้องเพิ่มคลาสลงใน ComboBox หลายครั้ง มิฉะนั้นจะง่ายกว่าที่จะใช้พจนานุกรมตามที่อธิบายไว้ในคำตอบอย่างใดอย่างหนึ่ง
Alex Smith

เฮ้อเล็กซ์ฉันได้รับคำตอบกับ ethod ที่ฉันมักจะใช้ในกรณีเหล่านี้ ฉันคิดว่ามันใกล้เคียงกับที่คุณพูดหรือบางทีฉันก็ไม่เข้าใจสิ่งที่คุณพูด ฉันไม่ได้มาจากคลาสเพราะบางคลาสอาจต้องการให้คุณใช้วิธีการที่เราไม่ต้องการลบล้าง (ดังนั้นเราจึงมีวิธีการมากมายด้วยวิธีง่าย ๆbase.Method();) คุณต้องสร้างคลาสต่อเนื่อง สำหรับประเภทที่แตกต่างกันที่คุณต้องการเพิ่มลงในกล่องคำสั่งผสมหรือกล่องรายการ ชั้นเรียนที่ฉันทำมีความยืดหยุ่นคุณสามารถใช้กับประเภทใดก็ได้โดยไม่ต้องใช้ความพยายามเพิ่มเติม ดูด้านล่างสำหรับคำตอบของฉันและบอกฉันว่าคุณคิด :)
Matheus Rocha

ฉันเห็นด้วยว่าคำตอบของคุณดูเหมือนจะสะดวกกว่าการสร้างคลาสที่ได้มาสำหรับแต่ละประเภทที่คุณต้องการเพิ่มใน combobox งานที่ดี! ผมคิดว่าในอนาคตถ้าผมไม่ได้มีคุณสมบัติเช่น 'ชื่อ' พร้อมใช้ฉันจะใช้สิ่งที่ต้องการคำตอบหรือคำตอบพจนานุกรม :)
อเล็กซ์สมิ ธ

0

นี่เป็นวิธีที่ง่ายมากสำหรับรูปแบบ windows หากจำเป็นต้องใช้ทั้งหมดคือค่าสุดท้ายเป็น (สตริง) ชื่อของรายการจะปรากฏบนกล่องคำสั่งผสมและสามารถเปรียบเทียบค่าที่เลือกได้อย่างง่ายดาย

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;

และในตัวจัดการเหตุการณ์จะได้รับค่า (สตริง) ของค่าที่เลือก

string test = testComboBox.SelectedValue.ToString();

0

ทางออกที่ดีกว่าที่นี่;

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

เรียกคืนข้อมูล

MessageBox.Show(cmbUser.SelectedValue.ToString());

ในขณะที่ฉันสามารถเติม combobox ได้การคลิกที่มันทำให้เกิดข้อผิดพลาดนี้ใน VS2019 การเรียก QueryInterface ได้ทำการร้องขออินเทอร์เฟซคลาสของ COM ที่มีการจัดการคลาสที่มองเห็นได้ 'ComboBoxUiaProvider
MC9000
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.