ComboBox.ValueMember and DisplayMember

108,186

Solution 1

You should not set datasource of your listbox and/or combobox in this order

ComboBox1.DataSource = dataTable;

ComboBox1.ValueMember = "id"; 

ComboBox1.DisplayMember = "name";

Instead, this is correct order:

ComboBox1.ValueMember = "id"; 

ComboBox1.DisplayMember = "name";

ComboBox1.DataSource = dataTable;

NOTE: setting datasource should be last line.

If you set datasource first, SelectedIndexChanged event will fire and you may get the cast error or other exception.

Solution 2

Using keyvalue pairs to populate a combobox

A neat way to populate combo boxes is to set the datasource to a list of keyvalue pairs. It may also inspire using data stored in a list of some kind:

//Some values to show in combobox
string[] ports= new string[3] {"COM1", "COM2", "COM3"};

//Set datasource to string array converted to list of keyvaluepairs
combobox.Datasource = ports.Select(p => new KeyValuePair<string, string>(p, p)).ToList();

//Configure the combo control
combobox.DisplayMember = "Key";
combobox.ValueMember = "Value";
combobox.SelectedValue = ports[0];

The datasource can be populated using this syntax as well:

ports.Select(p => new { Key = p, Value = p }).ToList();

The technicue may be expanded with more property names for multiple column lists.

Solution 3

  ComboBox1.DataSource= dt; //the data table which contains data
  ComboBox1.ValueMember = "id";   // column name which you want in SelectedValue
  ComboBox1.DisplayMember = "name"; // column name that you need to display as text

Solution 4

I had the same trouble. In my case, SelectedIndexChanged event fires and just jumps out the method. Try do not use SelectedIndexChanged event. Or something like this:

ComboBox1.SelectedIndexChanged -= new System.EventHandler(ComboBox1_SelectedIndexChanged); 
ComboBox1.DataSource = dataTable; 
ComboBox1.ValueMember = "id";  
ComboBox1.DisplayMember = "name";
ComboBox1.SelectedIndexChanged += new System.EventHandler(ComboBox1_SelectedIndexChanged);

It worked for me. =)

Solution 5

ComboBox1.ValueMember = dataTable.Columns["id"].ColumnsName;   // column name which the values are not visible 
ComboBox1.DisplayMember = dataTable.Columns ["name"].ColumnsName;
 /* 
       column name that you need to select item by proprity : 
ComboBox1.SelectedItem; 
Or   you can use easly this : 
ComboBox1.Text; 
*/

ComboBox1.DataSource= dataTable; //the data table which contains data 
// and this should be last :)
Share:
108,186
dbncourt
Author by

dbncourt

Updated on January 20, 2020

Comments

  • dbncourt
    dbncourt over 4 years

    How do i set this values? I have a DataTable with all the data i want to set in the combobox, but i cant find how to set it.

    I tried

    ComboBox1.DataSource = dataTable;
    ComboBox1.ValueMember = "id"; // --> once hes here, he just jumps out the method
    ComboBox1.DisplayMember = "name";
    

    No compilation error, warning, nothing.. just jumps out!

    This is the query to fill the DataTable

    "Select * from \"Table\""
    

    I checked with the debugger and the datatable was filled. The columns names are "id" and "name". ComboBox is blank. I'm filling it for the first time!

  • dbncourt
    dbncourt about 12 years
    mmm, nop! it doesnt work. U see, dataTable has values in it cuz i checked with the debbuger, those columns names are exactly id and name. if i put it like u did, the id is listed in the combobox, for some reason idk cuz names have names in it. And It never reach the displaymamber line.
  • dbncourt
    dbncourt about 12 years
    I think dataTable is not a valid source, i saw it with DataSource, but i dont have that :/, maybe i can parse the DataTable into a DataSource?
  • dbncourt
    dbncourt about 12 years
    ComboBox1.DataBind(); this doesnt exist. At least not in my version (visual studio 2010) ComboBox.DataBindings. and is not a method.
  • PraveenVenu
    PraveenVenu about 12 years
    DataBind() is for Web applications only; if it is a windows application that line is not needed
  • AbcAeffchen
    AbcAeffchen over 9 years
    Your answer should contain an explanation of your code and a description how it solves the problem.
  • John
    John about 9 years
    Doesn't make sense; if you don't give the combobox the datasource first, how would it know what should be the ValueMember and what should be the DisplayMember if it doesn't have the data in the first place. That's a counter-intuitive practice.
  • DrewJordan
    DrewJordan almost 9 years
    @John you're right, it is counter-intuitive, but it works. Do a search for combobox datarowview and you'll see others who've had the same problem.
  • T.S.
    T.S. almost 8 years
    @John If you look how it works internally, you would understand that setting Datasource last is essential for performance. Because setting ValueMember triggers no action. If you set Datasource first, cbo will bind value member for you. Then, you're going to set new ValueMember [the one you want] and cbo will have to re-wire binding. So, if you set DS last, bindings will happen only once.
  • Hasnain
    Hasnain over 4 years
    It worked for me ! Thank You. Can you please tell me more about .ColumnsName property and datatable.Columns
  • HackSlash
    HackSlash almost 4 years
    That is a dangerous hack. You could use a Try ... Finally block to ensure that the event always gets turned back on. You could also set the DataSource last like the other answers.
  • Marcelo Scofano Diniz
    Marcelo Scofano Diniz almost 3 years
    This should be the answer; it functions perfectly with Enums as DataSource: Enum.GetValues(typeof(SomeEnum)).Cast<SomeEnum>().Select(e => new { Key = e, Value = e }).ToList();