ComboBox的联动

窗体搭建:

实现功能: 加载年级下拉框

               选中年级时加载出科目下拉框

加载年级下拉框:

第一步,在DAL层中写一个方法,检索所有的年级名称集合,返回的是泛型集合List<>

        public List<Grade> LoadAllGradeToList()
        {       
            string sql = "select * from grade";
            DataTable dt = SQLHelper.ExecuteDataTable(sql);
            MyTool tool = new MyTool();
            List<Grade> list=tool.DataTableToList<Grade>(dt);
            return list;
        }

第二步,在BLL层对DAL层中的所有方法做传递

   public class GradeBLL
    {
       GradeDAL dal = new GradeDAL();
       public List<Grade> getAllGradeList() 
       {
           return dal.LoadAllGradeToList();
       }
    }

第三步,在load窗体中绑定年级下拉框列

 private void FrmSeachByGrade_Load(object sender, EventArgs e)
        {
            //绑定年级下拉框
            List<Grade> list = grade.LoadAllGradeToList();
            cboGrade.ValueMember = "GradeId";
            cboGrade.DisplayMember = "GradeName";
            cboGrade.DataSource = list;
        }

实现效果:

根据年级编号,加载科目下拉框值

第一步,在DAL层写一个根据年级编号获取科目集合的方法

   public class SubjectDAL
    {
       public List<Subject> getAllSubjectByGradeId(int id) 
       {
           string sql = "select * from subject where gradeid=@id";
           SqlParameter para = new SqlParameter("@id",id);
           DataTable dt = SQLHelper.ExecuteDataTable(sql,para);
           MyTool tool = new MyTool();
           List<Subject> list=tool.DataTableToList<Subject>(dt);
           return list;
       }
    }

第二步,在BLL层对DAL层中的所有方法做传递

   public class SubjectBLL
    {
       SubjectDAL dal = new SubjectDAL();

       public List<Subject> getAllSubjectByGradeId(int id) 
       {
           return dal.getAllSubjectByGradeId(id);
       }
    }

第三步,UI层

 SubjectBLL subBll = new SubjectBLL();
        private void cboGrade_SelectedIndexChanged(object sender, EventArgs e)
        {
            int selectid = Convert.ToInt32(cboGrade.SelectedValue);
            List<Subject> list = subBll.getAllSubjectByGradeId(selectid);
            cboSubject.ValueMember = "subjectId";
            cboSubject.DisplayMember = "subjectName";
            cboSubject.DataSource = list;

实现效果:

但到这里,以上代码实现的功能有一个不可避免的问题

图片解释:

如何解决?

只需要在load事件中写一行代码即可

cboSubject.DropDownHeight = 106;

注:出现以下错误的解决方案

1.将DataSource=泛型集合,调整到最后一行

2.用标记,在Load 和SelectedIndexChanged之外,定义一个bool类型变量。然后在Load中设置成True,在SelectedIndexChanged中判定flag

原文地址:https://www.cnblogs.com/hr1997/p/5495461.html