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

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

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(, new Grade() { GradeId=-,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(, new Grade() { GradeId=-,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("出错");
}

ComboBox的联动(三层架构)的更多相关文章

  1. C# 学习笔记 三层架构系列(控件一)

    下面是我两周的学习总结:这是我写给自己的,如果哪位朋友有幸看到这篇文章就是缘分.如果所说的内容不对,就请纠正.勿喷!!! 想要将两周的学习知识通过文字.通过代码.通过图片储备起来,以防自己那天思维短路 ...

  2. asp.net三层架构 及其中使用泛型获取实体数据介绍

    asp.net中使用泛型获取实体数据可以发挥更高的效率,代码简洁方便,本例采用三层架构.首先在model层中定义StuInfo实体,然后在 DAL层的SQLHelper数据操作类中定义list< ...

  3. 关于三层架构与MVC的一些理解

    刚毕业的时候,参与了一个上位机的系统开发.上位机所使用的是.net Windows Form技术. 当时,和一个北理的姑娘在一个项目组里.因为她来公司时间比较长,而且经验比较丰富,所以,上位机的架构由 ...

  4. 架构和模式的区别:三层架构和MVC在应用开发中的位置

    架构是系统层面的,可以是多层架构,也可以是事件驱动架构,也可以是微服务架构. 模式是GUI应用的一种职责分离设计. 三层架构(包含多层架构)和 MVC模式(包含MVP, MVVM) 没什么关系,它们不 ...

  5. 从零开始编写自己的C#框架(5)——三层架构介绍

    三层架构对于开发人员来说,已经是司空见惯了,除了大型与超小型项目外,大多都是这种架构来进行开发. 在这里为初学者们简单介绍一下三层架构: (下面内容摘自<趣味理解:三层架构与养猪—<.NE ...

  6. 【转】浅谈MVC与三层架构

    首先给大家引入下MVC的概念: MVC(Model View Controller)模型.视图以及控制器,它是一种较为广泛应用的结构设计模式. 模型:就是在MVC设计模式中需要被显示的数据.在通常情况 ...

  7. 装13失败后的逆袭(ComboBox的联动)

    当我们在做ComboBox的联动的时候飞一般的敲出自认为完美的代码.在运行的时候突然变得不完美了. 比如: 如果发生了这种情况会不会就卡磁了呢 当然不会作为程序猿的我们考的是我们聪明的大脑,当然会想出 ...

  8. 有了门面,程序会更加体面!- pos软件基于三层架构 -09

    续上篇)        大鸟说道:“实际上没有学过设计模式去理解三层架构会有失偏颇的,毕竟分层是更高一级别的模式,所谓的架构模式.不过在程序中,有意识的遵循设计原则,却也可以有效的做出好的设计.”   ...

  9. 三层架构 与 MVC那点事儿

    以下为转载内容: 地址 MVC与三层架构的异同点 首先先解释一下MVC. V即View.是视图的意思. C即Controler.是控制器的意思. M即Model,是模型的意思. 这三个里.最不容易理解 ...

随机推荐

  1. 整理PHP_YII环境安装遇到的一些问题

    安装yii遇到的一些问题 操作环境 一.Permissiondenied问题 在终端执行如下命令(注意因为是本地测试环境不需要考虑太多权限问题,如果正式环境请慎重) sudo chmod -R o+r ...

  2. Quartz的线程池解析

    [org.quartz.core相关类图] 可以看到核心类为QuartzScheduler [QuartzScheduler构造函数] public QuartzScheduler(QuartzSch ...

  3. Linux Unix 环境变量设置实例

    背景 从第一次写Hello World我们便开始接触环境变量.这最基础的系统设置是必须要掌握的,尤其在是Linux/Unix系统中.比如,哪天某个Java进程出现问题,我们想分析一下其线程堆栈,却发现 ...

  4. Python基本语句

    x = 1 y = 1 dataf = 1.0 def fun1(): print("fun1") class ClassB(): def __init__(self): prin ...

  5. Cloning EBS from Linux 5 to Linux 6 Fails: "Error While Loading Shared Libraries: libclntsh.so.10.1

    SYMPTOMS    During clone Oracle Applications R12 from Linux 5 to Linux 6 the following error occurs ...

  6. 浅析MongoDB数据库的海量数据存储应用

    [摘要]当今已进入大数据时代,特别是大规模互联网web2.0应用不断发展及云计算所需要的海量存储和海量计算发展,传统的关系型数据库已无法满足这方面的需求.随着NoSQL数据库的不断发展和成熟,可以较好 ...

  7. osgi:设置httpservice端口号

    使用osgi开发http类的Service,在启动时默认端口是80.但有可能这个端口已经被本机上的其他程序占用.那么解决问题的方法有两种:1)关闭或修改占用程序的端口: 2)修改osgi启动时的端口. ...

  8. python 字符串复制

    通过变量来进行赋值 fstr = 'strcpy'sstr = fstrfstr = 'strcpy2'print sstr

  9. zmq 学习笔记

    0. PUB/SUB, XPUB/XSUB filtering happens at publisher sides when sockets are using a connected protoc ...

  10. Sublime Text3 插件集合

    下载地址:http://download.csdn.net/detail/yinluhui/9029791 [包含的插件有: AndyJS2.BracketHighlighter.emmet-subl ...