Search code examples
c#comboboxgeneric-listvaluemember

How can I combine two class members to be a combobox's joint DisplayMember?


I've got the following code to populate a combobox with the contents of a generic list, trying to use a concatenation of FirstName and LastName as the combobox's DisplayMember:

private void PopulateStudentsComboBox()
{
    if (System.IO.File.Exists(AYttFMConstsAndUtils.STUDENTS_FILENAME))
    {
        if (null == _studentsList)
        {
            var students = System.IO.File.ReadAllText(AYttFMConstsAndUtils.STUDENTS_FILENAME);
            _studentsList = JsonConvert.DeserializeObject<List<Student>>(students);
        }
        // Sort by firstname            
        _studentsList = _studentsList.OrderBy(i => i.FirstName).ToList();
        comboBoxStudents.DataSource = _studentsList; 
        string firstNameLastName = "FirstName LastName";
        comboBoxStudents.DisplayMember = firstNameLastName;
        comboBoxStudents.ValueMember = "StudentID";
    }
}

This doesn't work; the ValueMember becomes the DisplayMember.

This works:

. . .
comboBoxStudents.DataSource = _studentsList; 
comboBoxStudents.DisplayMember = "FirstName";
comboBoxStudents.ValueMember = "StudentID";
. . .

...but doesn't cut the mustard - I need both given and surnames, not just the given name (or vice versa).

How can I combine two class fields to comprise a combobox's DisplayMember?


Solution

  • I would extend the Student class with a Property which returns "FirstName + LastName"

    like...

    ...
        public string DisplayName
            {
                get
                {
                    return string.Format("{0} {1}", this.FirstName, this.LastName);
                }
            }
    ...
    

    than assign this property to the DisplayMember

    comboBoxStudents.DisplayMember = "DisplayName";