2016-02-21 4 views
0

Я успешно добавление пары Display/значение в выпадающем списке, как это:Как добавить DisplayMember и ValueMember в один элемент ComboBox, который имеет назначенный DataSource?

List<Student> BRStudents = 
     studentsList.Where(h => h.EnrolledInAYttFM) 
      .Where(i =>  
    i.RecommendedNextTalkTypeID.Equals(BIBLE_READING_TALK_TYPE)) 
      .OrderBy(j => j.WeekOfLastAssignment) 
      .ToList(); 
    comboBoxBR.DataSource = BRStudents; 
    comboBoxBR.DisplayMember = "FullName"; 
    comboBoxBR.ValueMember = "StudentID"; 

... но я тогда (в некоторых случаях) хотят добавить еще один пункт к comboBoxBR, один из которых не присутствует в BRStudents список. Если я пытаюсь сделать это:

AssignmentHistory ah = AYttFMConstsAndUtils.AssignmentHistList 
    .FirstOrDefault(i => i.WeekOfAssignment == currentWeek && i.TalkType == 1); 
string fullName = AYttFMConstsAndUtils.GetStudentFullNameForID(ah.StudentID_FK); 
comboBoxBR.Items.Add(fullName); 

... Я получаю «Коллекция предметов не может быть изменен, когда свойство DataSource установлено»

Действительно, я хочу сделать что-то вроде этого:

comboBoxBR.Items.Add(fullName, ah.StudentID_FK); 

Есть ли способ объединить два результата (список студента и одного AssignmentHistory) в словарь или некоторой такую ​​коллекцию, а затем назначить , что как источник данных для comboBoxBR?

Для полного раскрытия, вот определения Студента и AssignmentHistory:

public class Student 
{ 
    public int StudentID { get; set; } 
    public int FamilyID { get; set; } 
    public bool EnrolledInAYttFM { get; set; } 
    public DateTime DateEnrolledOrHiatusAYttFM { get; set; } 
    public bool GivesBibleReading { get; set; } 
    public bool PresentsICRVBS { get; set; } 
    public bool IsHouseholder { get; set; } 
    public bool IsMale { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string EmailAddr { get; set; } 
    public DateTime WeekOfLastAssignment { get; set; } 
    public int RecommendedNextTalkTypeID { get; set; } 
    public int NextCounselPoint { get; set; } 
    public string FullName => $"{FirstName} {LastName}"; 
} 

public class AssignmentHistory 
{ 
    public DateTime WeekOfAssignment { get; set; } 
    public int TalkType { get; set; } 
    public int StudentID_FK { get; set; } 
    public int AssistantID_FK { get; set; } 
    public int CounselPoint { get; set; } 
    public bool HasBeenEmailed { get; set; } 
    public bool SlipHasBeenPrinted { get; set; }   
} 

ответ

1

Вместо добавления элементов в коллекции предметов комбо (не представляется возможным, если вы установите DataSource), первое, что приходит для разума добавляются элементы к самому List<Students>, которые используются как DataSource, но это не достигает вашей цели, потому что нет механизма для информирования ComboBox о том, что у DataSource есть новый элемент. Вы не можете видеть добавленный элемент, если вы не переустановите список в поле со списком. Для этого вам сначала нужно отвязать предыдущий DataSource, а затем снова перестроить список.

// Assuming a lot about your student class, hope it's clear the intention 
BRStudents.Add(new Student() { newName = "ANewStudent", ID = 1}); 
comboBoxBR.DataSource = null; 
comboBoxBR.DataSource = BRStudents; 
comboBoxBR.DisplayMember = "FullName"; 
comboBoxBR.ValueMember = "StudentID"; 

Однако, есть лучшее решение, и это класс BindingList(T)
Этот класс способен обновить объект, на котором вы связать его экземпляр.

Итак, когда вы связываете комбо в первый раз вы должны написать

BindingList<Student> bl = new BindingList<Student>(BRStudents); 
comboBoxBR.DataSource = bl; 
comboBoxBR.DisplayMember = "FullName"; 
comboBoxBR.ValueMember = "StudentID"; 

и когда вы хотите, чтобы добавить новый элемент в списке вы пишете
(перемещение бл в глобальной области видимости, если это необходимо)

bl.Add(new Student() { newName = "ANewStudent", ID = 1}); 

в документации говорится, что вы должны вызвать ResetBindings для принудительного обновления элемента управления, но это не кажется, всегда требуется ...

 Смежные вопросы

  • Нет связанных вопросов^_^