你的位置:首页 > ASP.net教程

[ASP.net教程]ComboBox的联动(三层架构)


需求:根据年级下拉框的变化使得科目下拉框绑定次年级下对应有的值

 

我们用三层架构的模式来实现

1.我们想和数据库交互,我们首先得来先解决DAL数据库交互层

   

  01.获得年级下拉框的数据

   在GradeDAL类中

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using System.Data.SqlClient;using System.Data;using MySchool.Model;using System.Configuration;namespace MySchool.DAL{  //数据访问层  public class GradeDAL  {    public static string Constr = ConfigurationManager.ConnectionStrings["constr"].ConnectionString;    #region 获得年级表     public DataTable SelectGrade(string gradetype)    {      //和数据库交互      string str = "Data Source=.;initial catalog=MySchool;uid=sa";      SqlConnection con = new SqlConnection(str);      string sql = "";      if (gradetype=="")      {        sql = "select * from Grade";      }      else      {        sql = "select * from Student where GradeId in (select GradeId from Grade where GradeName='" + gradetype + "')";      }           SqlDataAdapter da = new SqlDataAdapter(sql, con);      DataSet ds = new DataSet();      //捕获异常      try      {        da.Fill(ds, "stuInfo");      }      catch (Exception ex)      {        throw new Exception(ex.Message);      }      //返回一张表的数据      return ds.Tables["stuInfo"];    }    #endregion    #region 获取年级数据,为在下拉框中显示     //定义一个集合,储存年级信息     List<Grade> list = new List<Grade>();     #region 方法一: 以返回表的方式     public DataTable LoadCombox()     {       string sql = "select * from Grade";       DataTable dt = SQLHelper.ExecuteDataTable(sql);       return dt;     }     #endregion     #region 方法二:以返回集合的方式     public List<Grade> Loadcombox2()      {       string sql = "select * from Grade";       DataTable dt = SQLHelper.ExecuteDataTable(sql);       //方法一:       foreach (DataRow row in dt.Rows)       {         //每一个row代表表中的一行,所以一行对应一个年级对象         Grade grade = new Grade();         grade.GradeId = Convert.ToInt32(row["gradeid"]);         grade.GradeName = row["gradename"].ToString();         list.Add(grade);       }       //方法二:(使用MyTool类)       //MyTool tool=new MyTool();       //list = tool.DataTableToList<Grade>(dt);       return list;     }    #endregion     #region 方法三:要求使用using语句     public List<Grade> LoadCombox3()      {       //using的作用可以释放资源,利于资源的回收(可以省略关闭连接)       using (SqlConnection con=new SqlConnection(Constr))       {         try         {            string sql = "select * from Grade";            SqlCommand cmd = new SqlCommand(sql,con);            con.Open();            SqlDataReader dr = cmd.ExecuteReader();            while (dr.Read())            {              Grade gr = new Grade();              gr.GradeId = Convert.ToInt32(dr["GradeId"]);              gr.GradeName=dr["GradeName"].ToString();              list.Add(gr);            }                }         catch (Exception ex)         {           throw new Exception(ex.Message);          }       }       return list;     }    #endregion     #endregion              }}

  02.在业务逻辑层

   

    

using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using MySchool.DAL;using System.Data;using MySchool.Model;namespace MySchool.BLL{  public class GradeBLL  {    GradeDAL gradedal = new GradeDAL();    #region 获取年级数据,为在下拉框中显示    public DataTable SelectGrade(string gradetype)    {      return gradedal.SelectGrade(gradetype);    }    public DataTable LoadCombox()    {     return gradedal.LoadCombox();    }       public List<Grade> Loadcombox2()    {      return gradedal.Loadcombox2();    }    #endregion    public List<Grade> LoadCombox3()    {      return gradedal.LoadCombox3();    }     }}

  03.在窗体UI层

   在Load事件中加载年级下拉框

 private void FrmSelectResult_Load(object sender, EventArgs e)    {      #region 加载年级下拉框      try      {        List<Grade> list = gradedal.LoadCombox3();        list.Insert(0, new Grade() { GradeId=-1,GradeName="--全部--" });        cboGrade.ValueMember = "GradeId";        cboGrade.DisplayMember = "GradeName";        cboGrade.DataSource = list;      }      catch (Exception ex)      {        MessageBox.Show(ex.Message);      }               #endregion      #region 加载科目下拉框      //try      //{      //  list2 = subjectdal.LoadComboxSub();      //  list2.Insert(0, new Subject() { SubjectId = -1, SubjectName = "--全部--" });      //  cboSubject.ValueMember = "SubjectId";      //  cboSubject.DisplayMember = "SubjectName";      //  cboSubject.DataSource = list2;      //}      //catch (Exception ex)      //{      //  MessageBox.Show(ex.Message);      //}           #endregion    }

 其中在使用

获得年级下拉框隐藏值得方法(2)
int num = Convert.ToInt32(cboGrade.SelectedValue);

加载年级下拉框时:会出现的错误的写法

把cboGrade.DataSource = list;写在
 cboGrade.ValueMember = "GradeId"; cboGrade.DisplayMember = "GradeName";上面
即:
 #region 加载年级下拉框      try      {        List<Grade> list = gradedal.LoadCombox3();        list.Insert(0, new Grade() { GradeId=-1,GradeName="--全部--" });        cboGrade.DataSource = list;        cboGrade.ValueMember = "GradeId";        cboGrade.DisplayMember = "GradeName";                     }      catch (Exception ex)      {        MessageBox.Show(ex.Message);      }               #endregion

这是就会出现下面错误:

在年级的SelectedIndexChanged事件中 

 try      {        //根据年级取得科目信息并绑定          #region 获得年级下拉框隐藏值得方法(1)        Grade sub = (Grade)cboGrade.SelectedItem;        int num =sub.GradeId;        #endregion        #region 获得年级下拉框隐藏值得方法(2)        // int num = Convert.ToInt32(cboGrade.SelectedValue.ToString());        #endregion                List<Subject> list = subjectdal.LoadComboxSub2(num);                cboSubject.ValueMember = "SubjectId";        cboSubject.DisplayMember = "SubjectName";        cboSubject.DataSource = list;                      }      catch (Exception)      {        MessageBox.Show("出错");      }