为什么没有发现和选择我的组合框项目?
Why is my combobox item not being discovered and selected?
受到答案 的启发,我重构了我的代码以通过 LINQ 在其初始填充后向我的通用列表添加一条记录,然后尝试 select 在组合框中添加的项目分配了列表的内容。
对于某些 context/conceptualization,组合框会填充候选学生;但是,如果显示的那一周已经安排好了,那么已经安排在该周的那个槽中的学生将被插入到列表中,该列表在其他列表之后用作组合框的数据源。最后,如果组合框中确实存在这样的学生,我的意图是 select 那个(但其他人在列表中仍然可用,以防需要更改分配的学生)。
代码如下:
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是应该的,而是 现在添加到列表中,然后是组合框,该项目 不是 select 编辑了那一行:
comboBoxBR.SelectedIndex = comboBoxBR.Items.IndexOf(assignedStudent.FullName);
相反,comboBoxBR.SelectedIndex 是 -1(尽管再次强调,此时组合框中确实存在 fullName)。
注:Studentclass的"FullName"成员计算为:
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 { ; }
}
}
列表由 Student 对象组成,但 FullName 是一个字符串。您需要查找整个 Student 对象。您需要将相关行更改为:
comboBoxBR.SelectedIndex = comboBoxBR.Items.IndexOf(assignedStudent);
当您使用 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;
您可以在集合中找到它们,但它可以帮助您忘记控件已绑定。
受到答案
对于某些 context/conceptualization,组合框会填充候选学生;但是,如果显示的那一周已经安排好了,那么已经安排在该周的那个槽中的学生将被插入到列表中,该列表在其他列表之后用作组合框的数据源。最后,如果组合框中确实存在这样的学生,我的意图是 select 那个(但其他人在列表中仍然可用,以防需要更改分配的学生)。
代码如下:
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是应该的,而是 现在添加到列表中,然后是组合框,该项目 不是 select 编辑了那一行:
comboBoxBR.SelectedIndex = comboBoxBR.Items.IndexOf(assignedStudent.FullName);
相反,comboBoxBR.SelectedIndex 是 -1(尽管再次强调,此时组合框中确实存在 fullName)。
注:Studentclass的"FullName"成员计算为:
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 { ; }
}
}
列表由 Student 对象组成,但 FullName 是一个字符串。您需要查找整个 Student 对象。您需要将相关行更改为:
comboBoxBR.SelectedIndex = comboBoxBR.Items.IndexOf(assignedStudent);
当您使用 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;
您可以在集合中找到它们,但它可以帮助您忘记控件已绑定。