2016-02-21 4 views
0

Вдохновленный ответом here, я реорганизовал свой код, чтобы добавить запись в свой общий список после ее популяции initil через LINQ, а затем попытаться выбрать этот добавленный элемент в поле со списком, которому назначено содержимое списка.Почему мой элемент combobox не обнаружен и не выбран?

Для некоторых контекстов/концептуализации поле со списком заполняется студентами-кандидатами; если отображаемая неделя уже запланирована, хотя ученик, уже запланированный в этом слоте на эту неделю, вставляется в список, который служит в качестве источника данных combobox после других. Наконец, если такой ученик существует в поле со списком, мое намерение состоит в том, чтобы выбрать этот (но остальные остаются в списке в случае необходимости изменения назначенного студента).

Вот код:

private void PopulateBibleReadingComboBox() 
{ 
    int BIBLE_READING_TALK_TYPE = 1; 
    if (!System.IO.File.Exists(AYttFMConstsAndUtils.STUDENTS_FILENAME)) return; 
    if (null == studentsList) return; 
    string assignedStudentFirstname = string.Empty; 
    string assignedStudentLastname = string.Empty; 
    Student assignedStudent = null; 

    if (currentWeekSaved) 
    { 
     DateTime currentWeek = Convert.ToDateTime(comboBoxWeekToSchedule.SelectedValue); 
     AssignmentHistory ah = AYttFMConstsAndUtils.AssignmentHistList 
      .FirstOrDefault(i => i.WeekOfAssignment == currentWeek && i.TalkType == 1); 
     assignedStudentFirstname = AYttFMConstsAndUtils.GetStudentFirstNameForID(ah.StudentID_FK); 
     assignedStudentLastname = AYttFMConstsAndUtils.GetStudentLastNameForID(ah.StudentID_FK); 
     assignedStudent = new Student() {FirstName = assignedStudentFirstname, LastName = assignedStudentLastname, StudentID = ah.StudentID_FK}; 
    } 
    List<Student> BRStudents = 
    studentsList.Where(h => h.EnrolledInAYttFM) 
     .Where(i => i.RecommendedNextTalkTypeID.Equals(BIBLE_READING_TALK_TYPE)) 
     .OrderBy(j => j.WeekOfLastAssignment) 
     .ToList(); 
    if (null != assignedStudent) 
    { 
     BRStudents.Add(assignedStudent); 
    } 
    comboBoxBR.DataSource = BRStudents; 
    comboBoxBR.DisplayMember = "FullName"; 
    comboBoxBR.ValueMember = "StudentID"; 
    if (null != assignedStudent)) 
    { 
     comboBoxBR.SelectedIndex = comboBoxBR.Items.IndexOf(assignedStudent.FullName); 
    } 
} 

Проблема заключается в том, что, хотя условный «SelectedIndex/IndexOf» линия является достигнута, и assignedStudent.FullName является то, что оно должно быть, и является теперь добавлены в список, а затем в выпадающем списке, что элемент не выбран с этой линии:

comboBoxBR.SelectedIndex = comboBoxBR.Items.IndexOf(assignedStudent.FullName); 

Скорее comboBoxBR .SelectedIndex равен -1 (хотя, опять же, что fullName существует в combobox в этой точке).

Примечание: Член «FullName» класса Student рассчитывается следующим образом:

public class Student 
{ 
    public int StudentID { get; set; } 
    . . . 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    . . . 
    public string FullName 
    { 
     get 
     { 
      return string.Format("{0} {1}", FirstName, LastName); 
     } 
     set { ; } 
    } 
} 

ответ

1

Список составлен из объектов Student, но ПолноеИмя строка. Вам нужно искать весь объект Student. Вы хотите, чтобы изменить линию в вопросе:

comboBoxBR.SelectedIndex = comboBoxBR.Items.IndexOf(assignedStudent); 
1

При использовании DataSource это как если бы объекты были добавлены к коллекции (и в той или иной форме или моды, которые вполне могут иметь место в случае капот). Таким образом, поиск только имени в коллекции элементов не удастся. Более MCVE:

Students = new List<Student>(); 

Students.Add(new Student(7, "Zowie", "Halston")); 
Students.Add(new Student(6, "Ziggy", "Watson")); 
Students.Add(new Student(18, "Zalgo", "d'Artagnan")); 
Students.Add(new Student(67, "Tabitha", "Black")); 

Student luckyStudent = Students.First(w => w.FirstName == "Ziggy"); 

cbo1.DataSource = Students; 
cbo1.DisplayMember = "FullName"; 
cbo1.ValueMember = "Id"; 

Затем, установив выбор:

if (luckyStudent != null) 
{ 
    // set selected: (WORKS): 
    //cbo1.SelectedItem = luckyStudent; 

    // set Index of item (WORKS): 
    //cbo1.SelectedIndex = cbo1.Items.IndexOf(luckyStudent); 

    // set Index of item name (FAILS): 
    cbo1.SelectedIndex = cbo1.Items.IndexOf(luckyStudent.FullName); 
} 

Как правило, при использовании DataSource, я стараюсь, чтобы избежать махинаций с коллекцией предметов на всех. Если вы попытаетесь добавить или удалить с items, вы закричаете. Итак, для этого, я хотел бы использовать

cbo1.SelectedItem = luckyStudent; 

Вы можете найти их в коллекции, но он может помочь вам потерять отслеживать, что контроль связан.