#头条创作挑战赛#
界面与控件简介
程序运行界面
首先说声抱歉,程序中没有使用昨天说的单例窗体(实现起来代码看着比较绕,等之后使用数据库再细说)此次使用的方式更易理清内在逻辑也更便于理解
简单说下窗体界面中各个控件的作用:
1 文本框2个作用(Name属性值:txtStuname):
1.1显示文本:在单元格的事件中选中哪行单元格,将其对应文本赋值给文本框显示
1.2输入文本:在选中与修改按钮的单击事件中获取输入文本框的文本
为文本框添加一个TextChanged事件,用于还原文本框背景色
2 两个ComboBox组合框控件(通过属性设置为下拉列表框的功能)
Name属性值: cmbCname(左侧) cmbSer(右侧)
2.1 左侧的组合框:在新增与修改事件中用于获取当前选中的信息
2.2 右侧的组合框:用于查询学员按钮的事件事件中,根据选定的选项查询出对应数据
它们自身都有一个SelectedIndexChanged事件,在事件中设置/获取学员信息
3 四个按钮都有一个单击事件,在事件中编写相应的实现代码
Name属性值:btnAdd/btnDel/btnMod/btnSer/btnAll(增删改查/重新全部)
以上控件全部位于容器控件GroupBox控件中
4 最下面是用于每次增删改查操作后要显示数据的DataGridView(dgvStudent)
此控件添加一个CellClick事件.在事件中用于获取当前选中学员的编号Sid并将对应信息赋值给文本框与左侧的组合框
自定义集合数据
使用一个类文件(Datas.cs)作为程序的数据源
public class Datas
{
//定义静态集合类型的字段,作为数据源
//学员数据
public static List<Student> studata = Datas.GetStu();
//返回自定义的数据
public static List<Student> GetStu()
{
List<Student> ls = new List<Student>();
ls.Add(new Student() { sId = 1, sCId = 1, sName = "张三", SCname = "C#" });
ls.Add(new Student() { sId = 2, sCId = 2, sName = "李四", SCname = "Java" });
ls.Add(new Student() { sId = 3, sCId = 1, sName = "王五", SCname = "C#" });
ls.Add(new Student() { sId = 4, sCId = 2, sName = "马六", SCname = "Java" });
ls.Add(new Student() { sId = 5, sCId = 3, sName = "赵启", SCname = "C语言" });
ls.Add(new Student() { sId = 6, sCId = 1, sName = "王伟", SCname = "C#" });
ls.Add(new Student() { sId = 7, sCId = 2, sName = "张开印", SCname = "Java" });
ls.Add(new Student() { sId = 8, sCId = 3, sName = "黎星刻", SCname = "C语言" });
ls.Add(new Student() { sId = 9, sCId = 1, sName = "宋柯键", SCname = "C#" });
return ls;
}
//班级分组数据
public static List<Class> cladata = Datas.GetCla();
private static List<Class> GetCla()
{
//班级数据
List<Class> lc = new List<Class>();
lc.Add(new Class() { CId = 1, CName = "C#" });
lc.Add(new Class() { CId = 2, CName = "Java" });
lc.Add(new Class() { CId = 3, CName = "C语言" });
return lc;
}
}
设置dgvStudent与组合框控件属性
1)AutoSizeColumnsMode:设置为 full,作用:将单元格的列宽撑满dgvStudent控件
2)SelectionMode:设置为 FullRowSelect,作用:只能选中一整行
3)MultiSelect:设置为 false,作用:不允许选中多行
设置两个组合框控件的DropDownStyle属性为DropDownList,作用:只能选择组合框中的选项,不能修改其选项中的值
添加事件实现功能
1 为窗体添加Load 加载事件,将学员与班级分组数据绑定在对应控件上
//声明为窗体类 FMain 的成员变量
List<Class> cladata;//班级分组数据
List<Student> studata;//学员数据
int Sid = 0;//设置/获取学员编号
int Cid = 0;//设置/获取班级id
string SCname = "";//设置/获取班级名称
//加载事件
private void FMain_Load(object sender, EventArgs e)
{
//获取班级数据
studata = Datas.studata;
//绑定数据到dgvStudent控件上
BindingSource bs = new BindingSource();
bs.DataSource = studata;
dgvStudent.DataSource = bs;
//获取班级数据
cladata = Datas.cladata;
//绑定左侧的组合框控件上
cmbCname.DataSource = cladata;
//默认选中组合框的第一项
cmbCname.SelectedIndex = 0;
//将班级数据复制一份给右侧的组合框
//作用:防止两个组合框出现联动
Class[] cs = new Class[cladata.Count];
cladata.CopyTo(cs);
cmbSer.DataSource = cs;
cmbSer.SelectedIndex = 0;
}
2 新增按钮单击事件
只添加姓名与班级Id与班级名称,编号这类数据的值一般都是一条记录的唯一标识,常由数据库,随机数,Guid等方式进行赋值,不会让用户进行编辑输入
private void btnAdd_Click_1(object sender, EventArgs e)
{
//为学生添加一个编号
int sid = studata.Count + 1;
//获取学员姓名文本框的文本
string sname = txtStuname.Text.Trim();
//如何文本框为空,使文本框背景色变红,用于提示用户输入文本
if (string.IsNullOrEmpty(sname))
{
txtStuname.BackColor = Color.Red;
//文本框为空时,程序不再执行事件中其他的代码
return;
}
//获取左侧组合框中的班级id
//SelectedIndex 索引 从0开始,因此加1
int cid = cmbCname.SelectedIndex + 1;
//获取组合框中的班级名称
string cname = cmbCname.SelectedValue.ToString();
//将获取的数据加入集合中 { 语法糖 }
Student stu=new Student() { sId = sid, sName = sname, sCId = cid, SCname = cname };
studata.Add(stu);
//重新绑定数据,就会显示刚刚新增的学员信息
BindingSource bs = new BindingSource();
bs.DataSource = studata;
dgvStudent.DataSource = bs;
}
新增学员
//当新增,修改操作的文本框为空时变红
//输入内容时设置文本框背景色为白色
private void txtStuname_TextChanged(object sender, EventArgs e)
{
txtStuname.BackColor = Color.White;
}
2 删除选中的学员信息
删除信息的逻辑:首先在dgvStudent控件的CellClick事件中获取要删除的学员编号,通过编号,"删除"该编号的学员信息,最后重新绑定数据
//dgvStudent控件的第一个单击事件
private void dgvStudent_CellClick(object sender, DataGridViewCellEventArgs e)
{
//得到第一行的数据
DataGridViewRow dr = dgvStudent.SelectedRows[0];
//通过第一行第一列得到学员编号
Sid = Convert.ToInt32(dr.Cells[0].Value);
//得到学员姓名
txtStuname.Text = dr.Cells[1].Value.ToString();
//得到班级的 Cid
Cid = Convert.ToInt32(dr.Cells[2].Value);
//改变左侧组合框的索引值,达到联动效果
cmbCname.SelectedIndex = Cid - 1;
}
删除按钮的单击事件
private void btnDel_Click(object sender, EventArgs e)
{
if (Sid == 0)
{
MessageBox.Show("请先选择要删除的学员");
return;
}
else
{
//获取"删除"后的数据
studata = StuList(Sid);
//重新绑定(可以放在一个方法中)
BindingSource bs = new BindingSource();
bs.DataSource = studata;
dgvStudent.DataSource = bs;
}
}
//将对应学员编号的数据过滤掉
//达到"删除"选中编号学员信息的效果
private List<Student> StuList(int sid)
{
List<Student> ls = new List<Student>();
for (int i = 0; i < studata.Count; i++)
{
if (sid != studata[i].sId)
{
ls.Add(studata[i]);
}
}
return ls;
}
3 修改学员信息
3.1 为左侧组合框注册SelectedIndexChanged索引发生改变事件
private void cmbCname_SelectedIndexChanged(object sender, EventArgs e)
{
//获取改变班级分组后的 班级的编号
Cid = cmbCname.SelectedIndex + 1;
//获取改变班级分组后的 班级的名称
SCname = cmbCname.SelectedValue.ToString();
}
3.2 修改按钮的单击事件
private void btnMod_Click(object sender, EventArgs e)
{
//通过循环找到选中学员的编号
//如何修改该学员的信息
for (int i = 0; i < studata.Count; i++)
{
if (Sid == studata[i].sId)
{
//根据学员编号,修改学员相应的信息
studata[i].sName = txtStuname.Text.Trim();
studata[i].sCId = Cid;
studata[i].SCname = SCname;
}
}
//重新绑定数据
BindingSource bs = new BindingSource();
bs.DataSource = studata;
dgvStudent.DataSource = bs;
}
修改选中学员的信息
4 查询学员数据
4.1为右侧的组合框注册SelectedIndexChanged索引发生改变的事件
private void cmbSer_SelectedIndexChanged(object sender, EventArgs e)
{
//只需得到班级分组的班级id即可
Cid = cmbSer.SelectedIndex + 1;
}
4.2 查询各个分组的学员信息
private void btnSer_Click(object sender, EventArgs e)
{
List<Student> ls = new List<Student>();
for (int i = 0; i < studata.Count; i++)
{
//通过循环筛选出与左侧班级id相同的学员数据
if (Cid == studata[i].sCId)
{
ls.Add(studata[i]);
}
}
//重新绑定
BindingSource bs = new BindingSource();
//注意:绑定的数据源 不再是 studata
bs.DataSource = ls;//绑定筛选出来的数据
dgvStudent.DataSource = bs;
}
筛选出符合条件的数据
5 查询全部按钮单击事件
private void btnAll_Click(object sender, EventArgs e)
{
//用于分组查询信息后
//重新查看全部已有数据
BindingSource bs = new BindingSource();
bs.DataSource = studata;
dgvStudent.DataSource = bs;
}
现今所做的增删改查任一的操作,每次重启软件后,dgvStudent控件中显示的数据就会还原为原始数据(只存在内存中),除非将数据进行持久化处理(存储在磁盘上)
小结:
1)新增按钮:包括按钮的单击事件与文本框的内容改变事件
2)修改按钮:包括按钮单击事件与左侧组合框的索引改变事件
3)删除按钮:包括按钮单击事件与单元格单击事件
4)查询按钮:包括按钮单击事件与右侧组合框索引发生改变事件
示例中所有不是单击事件中代码的作用几乎都是为Sid/Cid/Sname/Cname赋值或取值