Combox聯動效果
如上圖所示窗體
實現點擊年級下拉框時,加載對應的科目信息
在此過程中會遇到如下問題
問題一:
步驟一:
Load事件中顯示如下代碼:
先綁定數據源,后綁定displaymember 和 valueMember屬性
就會報錯
private void SelectStudentResult_Load(object sender, EventArgs e) { //給年級下拉框賦值 List<Grade> gradeList= gradeBLL.LoadGradeInfoToCobList(); cobGradeList.DataSource = gradeList; cobGradeList.DisplayMember = "GradeName"; cobGradeList.ValueMember = "GradeId"; }
步驟二:
在年級下拉框的SelectedIndexChanged事件中加入如下代碼
private void cobGradeList_SelectedIndexChanged(object sender, EventArgs e) { try { cobSubjectList.DataSource = subBLL.GetSubjectInfoByGradeID(Convert.ToInt32(cobGradeList.SelectedValue)); cobSubjectList.DisplayMember = "subjectName"; cobSubjectList.ValueMember = "subjectid"; } catch (SqlException sqlex) { throw sqlex; } catch (Exception ex) { throw ex; } }
錯誤信息:
下面我們來分析一下出錯的原因
原因就出在代碼的執行順序上 我們可以用打斷點的方式來查看
當代碼執行到紅框標識處時,代碼塊直接跳到SelectedIndexChanged事件中,此時控件的displayMember和valueMember屬性還未被附上值
所以當藍色標識框去拿年級下拉框的隱藏值時就會報錯
解決方案:將load事件中的代碼改為
coblist.DisplayMember
coblist.ValueMember
coblist.DataSource=list;
解決方案二:
就是用SelectedItem代替SelectedValue
Load事件中的代碼不變
更改如下代碼
private void cobGradeList_SelectedIndexChanged(object sender, EventArgs e) { Grade grade = (Grade)cobGradeList.SelectedItem; int gradeid = Convert.ToInt32(grade.GradeId); cobSubjectList.DataSource = subBLL.GetSubjectInfoByGradeID(gradeid); cobSubjectList.DisplayMember = "subjectName"; cobSubjectList.ValueMember = "subjectid"; }
此處是泛型集合
如果是DataTable
更改的代碼為
DataRowView dr=(DataRowView)cobListGradeList.SelectedItem;
int gradeid=Convert.ToInt32(dr["gradeid"]);
不知道這些東西會不會給有需要幫助的人帶來一點點提示,如有意見歡迎指出
