天天看点

C# - 自定义集合数据实现增删改查操作 111

作者:传承文化瑰宝

#头条创作挑战赛#

界面与控件简介

C# - 自定义集合数据实现增删改查操作 111

程序运行界面

首先说声抱歉,程序中没有使用昨天说的单例窗体(实现起来代码看着比较绕,等之后使用数据库再细说)此次使用的方式更易理清内在逻辑也更便于理解

简单说下窗体界面中各个控件的作用:

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;
}           
C# - 自定义集合数据实现增删改查操作 111

新增学员

//当新增,修改操作的文本框为空时变红
//输入内容时设置文本框背景色为白色
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;
}           
C# - 自定义集合数据实现增删改查操作 111

删除按钮的单击事件

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;
}           
C# - 自定义集合数据实现增删改查操作 111

修改选中学员的信息

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;
}           
C# - 自定义集合数据实现增删改查操作 111

筛选出符合条件的数据

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赋值或取值

继续阅读