上次的年级列表做好了,今天就来做班级管理中的班级列表,与年级列表不同的是,班级列表增加了查询功能,如下图:
简单写下,查询这个浅色的框框是GroupBox,其功能是带有标题的框框(只是为了美观,没啥卵用),年级这些都是Label标签,选择年级的下拉菜单框用combobox,班级textbox,查询按钮button。
下半部分因为要显示出来表格的样子,和上次年级列表的界面设置一样,不多写,控件Datagridview。
给要用到的几个控件起名字:
年级的下拉菜单——cmbgrade
班级的textbox——textclass
下半部分信息展示的表格Datagridview——dgvclass
数据库:
数据库起名为class,有4个关键信息,如下图:
cid——班级编号,
cname——班级名称,
gid——年级编号(后面要与年级表连接),
remark——备注。
首先当我们点开班级列表这个界面的时候,就要自动加载出班级的下拉菜单和总的班级列表,调用两个初始化函数:
private void list_class_Load(object sender, EventArgs e)
{
initgrade(); //初始化加载年级列表
initclass(); //初始化加载班级列表
}
初始化年级列表:
大致思路是:下拉菜单需要Datatable来获取,指定给cmbclass
1.写sql语句来获取年级信息,Datatable来获取sql语句:
string sql = "select * from [grade]";
DataTable dtgrade = sqlhelper.getDataTable(sql);
2.获取grade表中数据
//获取grade表中数据
cmbgrade.DataSource = dtgrade; //comboBox来获取datatable
cmbgrade.DisplayMember = "gname"; //设置绑定的数据库对应的名称,显示的内容
cmbgrade.ValueMember = "gid";
3.(附加步骤)默认情况下显示“请选择“;
//默认“请选择“;添加一行
DataRow drow = dtgrade.NewRow();
drow["gid"] = 0;
drow["gname"] = "请选择";
dtgrade.Rows.InsertAt(drow, 0); //使dt.Rows.Add(dr)只是把选项追加到最后,而使用dt.Rows.InsertAt(dr, 0)可以把增加的选项插入到相应的位置上
初始化班级列表:
这里初始化加载要显示出编号,班级,年级信息,需要数据库中表class的gid和表grade中的gid相匹配进而展示出年级名称,数据库用到了inner join…on来关联两个表。
string sql = "SELECT cid, cname, gname FROM class c INNER JOIN grade g ON c.gid = g.gid ORDER BY c.cid";
DataTable dclass = sqlhelper.getDataTable(sql);
dgvclass.DataSource = dclass;
初始化完成后只剩下查询功能了,接下来写复杂的查询按钮:
1.获取用户输入信息
注意这里!!!用SelectedValue获取下拉菜单框的数据是object类型,你可以强制转换下试试,但我的VS不识别总报错,费了很大功夫查到可以ToString来获取string格式,最后再转化为int类型,实在想不到其他方法了,如果有人看到后,有高见,请私信我呀。
int setid=(int)cmbgrade.SelectedValue
string _value = cmbgrade.SelectedValue.ToString();
int setgid = int.Parse(_value);
string setclass = textclass.Text.Trim();
2.判断获取的数据是否为空
不管是否为空,我们都要用到初始化班级的sql语句,因为展示的内容一样,所以上个sql语句后加个where 1=1来表示该sql语句恒成立
判断获取的setid是否为0,不为0,则在sql语句加上条件,输入的年级id与表中年级id匹配,同理判断获取的setclass是否为空,进行模糊查询。
string sql = "select c.cid, c.cname, g.gname from (class c INNER JOIN grade g ON c.gid = g.gid) where 1=1 ";
//判断
if (setgid != 0)
{
sql += " and c.gid=@gid";
}
if (!string.IsNullOrEmpty(setclass))
{
sql += " and cname like @cname";
}
//定义参数数组 进行传参
OleDbParameter[] paras ={
new OleDbParameter("@gid",setgid),
new OleDbParameter("@cname","%"+setclass+"%")
};
DataTable dclass = sqlhelper.getDataTable(sql,paras);
dgvclass.DataSource = dclass;
注意这里模糊查询的问题:在sql语句中不加%,最后在传参时加%才有效。
到这里这部分就写完了,运行:
学生列表与班级列表相似,下次只写一点心得,布局和功能实现不多写。
附:今天的完整代码:
private void list_class_Load(object sender, EventArgs e)
{
initgrade(); //初始化加载年级列表
initclass(); //初始化加载班级列表
}
private void initgrade()
{
//下拉菜单也要datatable来获取,然后指定给comboBox
//用displaymember来show显示的值
string sql = "select * from [grade]";
DataTable dtgrade = sqlhelper.getDataTable(sql);
//默认“请选择“;添加一行
DataRow drow = dtgrade.NewRow();
drow["gid"] = 0;
drow["gname"] = "请选择";
dtgrade.Rows.InsertAt(drow, 0); //使用dt.Rows.Add(dr)只是把选项追加到最后,而使用dt.Rows.InsertAt(dr, 0)可以把增加的选项插入到相应的位置上
//获取grade表中数据
cmbgrade.DataSource = dtgrade; //comboBox来获取datatable
cmbgrade.DisplayMember = "gname"; //设置绑定的数据库对应的名称,显示的内容
cmbgrade.ValueMember = "gid";
}
private void initclass()
{
string sql = "SELECT cid, cname, gname FROM class c INNER JOIN grade g ON c.gid = g.gid ORDER BY c.cid";
DataTable dclass = sqlhelper.getDataTable(sql);
dgvclass.DataSource = dclass;
}
//查询
private void btncha_Click(object sender, EventArgs e)
{
//获取输入信息
string _value = cmbgrade.SelectedValue.ToString();
int setgid = int.Parse(_value);
string setclass = textclass.Text.Trim();
string sql = "select c.cid, c.cname, g.gname from (class c INNER JOIN grade g ON c.gid = g.gid) where 1=1 ";
//判断
if (setgid != 0)
{
sql += " and c.gid=@gid";
}
if (!string.IsNullOrEmpty(setclass))
{
sql += " and cname like @cname";
}
//定义参数数组 进行传参
OleDbParameter[] paras ={
new OleDbParameter("@gid",setgid),
new OleDbParameter("@cname","%"+setclass+"%")
};
DataTable dclass = sqlhelper.getDataTable(sql,paras);
dgvclass.DataSource = dclass;
}