C# ComboBox的联动操作(三层架构)
作者:天尽头的那片海 发布时间:2022-06-21 16:37:56
标签:C#,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("出错");
}


猜你喜欢
- Android N 可以同时显示多个应用窗口。 在手机上,两个应用可以在“分屏”模式中左右并排或上下并排显示。例如,用户可以 在上面窗口聊Q
- 一、什么是IOC1)控制反转,把创建对象和对象的调用过程交给Spring 管理。2)使用IOC的目的,为了降低耦合度。二、IOC的底层原理X
- 1 关于自动内存管理Java是由jvm来管理内存,包括自动分配以及自动回收,因此它不容易出现内存泄漏和内存溢出问题。C/C++,由程序员手动
- 1、conditional注解介绍含义: 基于条件的注解作用: 根据是否满足某一个特定条件来决定是否创建某个特定的bean意义: Sprin
- Mybatis 入参方式单个基本类型或 String 参数在 mapper 文件中随便写<select id=""
- 最近项目中遇到一个问题,在用户没填数据的时候,我们需要接收从前端传过来的对象为null,但是前端说他们一个一个判断特别麻烦,只能传个空对象过
- DATAXDataX 是阿里巴巴集团内被广泛使用的离线数据同步工具/平台,实现包括 MySQL、Oracle、SqlServer、Postg
- 一、什么叫做匿名类?匿名类就是没有名字的类。匿名类不能被引用,只能再创建的时候用new语句来声明。二、匿名类的优势以及应用场景;1、匿名类型
- 前言今天刚买了一台服务器,上面什么都没有,正好可以出一期 Linux 上配置java环境的教程可以看到我这个服务器上面是没有配置过 java
- IDEA service层跳转实现类的快捷图标消失了,但别人IDEA同样的代码可以正常看到跳转图标。。(暗示:这只是你的IDEA 编译器的b
- hystrix参数使用方法通过注解@HystrixCommand的commandProperties去配置,如下就是hystrix命令超时时
- 只是为了研究下idea这款编译器怎么使用。开门见山,说下如何配置这款编译器,不配置也能用,但是强迫症表示不服。下面直入正题:下载与安装就不说
- 分页是Java Web项目常用的功能,昨天在Spring MVC中实现了简单的分页操作和搜索分页,在此记录一下。使用的框架为(MyBatis
- 在EditText输入数字的时候,通常我们需要限制小数点前后位数。比如金额输入一般我们需要限制小数点后面最多2位。我们可以通过 TextWa
- 本文介绍了 SpringBoot之Controller的使用,分享给大家,具体如下:1.@Controller:处理http请求 2.@Re
- 目录位运算按位“与” &按位“或” |异或 ^移位运算左移 <<右移 >>无符号右移 >>>
- 前言本文介绍的是Android如何实现数字跳动效果的TextView,主要运用了DancingNumberView,DancingNumbe
- 自动登录是我们在软件开发时一个非常常见的功能,例如我们登录 QQ 邮箱:很多网站我们在登录的时候都会看到类似的选项,毕竟总让用户输入用户名密
- 开发环境: springboot + mybatis plus场景:在DAO的bean中有byte[]类时,写入可以成功,但是读取不行。从错
- 在电商上购买商品后,如果在下单而又没有支付的情况下,一般提示30分钟完成支付,否则订单自动。比如在京东下单为完成支付:超过24小时,就会自动