第五章:实现Windows程序的数据更新

本章目标

  1. 使用ADO.NET操作数据
  2. 使用PictureBox控件显示图片
  3. 使用Timer控件实现定时操作

本章内容

修改信息

问题:在上一章内容是讲到通过ListView将查询出来的信息展示出来,那么要修改选中的数据怎么实现呢?

具体分析:

添加快捷菜单,实现右键修改操作

获得选中学生的学号,将学员传入到编辑学生信息窗体

弹出编辑学生用户窗体

  1. 显示学生信息
  2. 保存修改后的信息

1714959154689

具体实现步骤:

  1. 在上一章内容中完成如上图所示功能

  2. 完成编辑页面的布局

    1714959901161

  3. 在编辑窗体中设置一个属性,来保存学生学号

    1
    2
    3
    4
    5
    6
    7
    8
    public partial class FrmEditStudent : Form
    {
    public int StudentNo;//定义要修改学生的学号
    public FrmEditStudent()
    {
    InitializeComponent();
    }
    }
  4. 右键修改操作,获取要修改的学生学号

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    private void tsmiUpdate_Click(object sender, EventArgs e)
    {
    if (lvStuList.SelectedItems.Count == 0)
    {
    MessageBox.Show("请选择要修改学生的信息!");
    return;
    }
    //获取学生学号
    string studentNo = lvStuList.SelectedItems[0].SubItems[0].Text;

    FrmEditStudent frm = new FrmEditStudent();
    frm.StudentNo = Convert.ToInt32(studentNo);//将选中的学号传入到编辑界面
    frm.Show();
    }
  5. 在编辑界面,根据传入的学号,在加载事件中查询出学生的基本信息,绑定在控件中

    1. 在编辑界面先加载年级,第二章有讲解过:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      public void LoadGrade()
      {
      DataTable dt = new DataTable();
      string connString = "server=.;database=MySchool;uid=sa;pwd=sa;";
      using (SqlConnection conn = new SqlConnection(connString))
      {
      conn.Open();
      string sql = "select gradeId,gradeName from Grade";
      SqlDataAdapter sda = new SqlDataAdapter(sql, conn);
      sda.Fill(dt);//填充表格

      cboGrade.DisplayMember = "gradeName";//指定下拉列表显示数据的列名
      cboGrade.ValueMember = "gradeId";//指定下拉列表值的列名
      cboGrade.DataSource = dt;//将表格数据绑定到下拉列表的数据源里

      }
      }
    2. 在加载学生信息

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      public void GetStudentByNo()
      {
      string connString = "server=.;database=MySchool;uid=sa;pwd=sa;";

      using (SqlConnection conn = new SqlConnection(connString))
      {
      conn.Open();
      string sql = "SELECT * FROM [Student] s JOIN Grade g on s.GradeId=g.GradeId where studentNo= " + StudentNo;


      SqlCommand cmd = new SqlCommand(sql, conn);
      SqlDataReader reader = cmd.ExecuteReader();

      // 将学生的信息显示在窗体上
      if (reader.Read())
      {
      this.txtStudentNo.Text = reader["StudentNo"].ToString();
      this.txtPwd.Text = reader["LoginPwd"].ToString();
      this.txtRePwd.Text = this.txtPwd.Text;
      this.txtName.Text = reader["StudentName"].ToString();
      string sex = reader["Sex"].ToString();
      if (sex == "女")
      {
      rbtnFemale.Checked = true;
      }
      else
      {
      rbtnMale.Checked = true;
      }
      cboGrade.SelectedValue = Convert.ToInt32(reader["GradeId"]);
      txtPhone.Text = reader["Phone"].ToString();
      txtAddress.Text = reader["Address"].ToString();
      dpBirthday.Value = Convert.ToDateTime(reader["BornDate"]);
      txtEmail.Text = reader["Email"].ToString();
      }

      reader.Close();
      }
      }
    3. 编辑界面加载事件调用以上二个方法:

      1
      2
      3
      4
      5
      private void FrmEditStudent_Load(object sender, EventArgs e)
      {
      LoadGrade();//加载年级
      GetStudentByNo();//加载学生信息
      }
    4. 根据学号信息学生信息

      1. 非空验证:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        public bool CheckInput()
        {
        //验证密码非空
        if (this.txtPwd.Text.Trim().Equals(string.Empty) || this.txtRePwd.Text.Trim().Equals(string.Empty))
        {
        MessageBox.Show("请输入密码!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        this.txtPwd.Focus();
        return false;
        }
        if (!this.txtPwd.Text.Trim().Equals(this.txtRePwd.Text.Trim()))
        {
        MessageBox.Show("两次输入的密码不一致!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        this.txtPwd.Focus();
        return false;
        }
        //验证姓名非空
        if (this.txtName.Text.Trim().Equals(string.Empty))
        {
        MessageBox.Show("请输入姓名!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        this.txtName.Focus();
        return false;
        }
        //性别非空
        if (!this.rbtnMale.Checked && !this.rbtnFemale.Checked)
        {
        MessageBox.Show("请选择性别!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        this.rbtnMale.Focus();
        return false;
        }
        //验证年级非空
        if (this.cboGrade.Text.Trim().Equals(string.Empty))
        {
        MessageBox.Show("请选择年级!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        this.cboGrade.Focus();
        return false;
        }
        //Email输入非空验证格式是否包含“@”
        if (!this.txtEmail.Text.Trim().Equals(string.Empty))
        {
        if (!this.txtEmail.Text.Contains("@"))
        {
        MessageBox.Show("电子邮件格式不正确!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Information);
        this.txtEmail.Focus();
        return false;
        }
        }
        return true;
        }
      2. 实现修改操作:

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        16
        17
        18
        19
        20
        21
        22
        23
        24
        25
        26
        27
        28
        29
        30
        31
        32
        33
        34
        35
        36
        37
        38
        39
        40
        41
        42
        43
        44
        45
        46
        47
        48
        49
        50
        51
        52
        53
        54
        55
        56
        57
        58
        59
        60
        61
        62
        63
        64
        65
        66
        67
        68
        69
        70
        71
        72
        73
        74
        75
        76
        77
        /// <summary>
        /// 将输入数据更新到学生表中
        /// </summary>
        /// <returns>true:成功,false:失败</returns>
        public bool UpdateStudent()
        {
        bool success = false; // 返回值,表示是否添加成功

        // 获取数据
        string pwd = this.txtPwd.Text.Trim(); // 密码
        string name = this.txtName.Text.Trim(); // 学生姓名

        //获取性别
        string sex = this.rbtnMale.Checked == true ? "男" : "女";
        int gradeId = Convert.ToInt32(this.cboGrade.SelectedValue); // 年级
        string phone = this.txtPhone.Text.Trim(); // 电话
        string address = this.txtAddress.Text.Trim(); // 地址
        DateTime date = this.dpBirthday.Value; // 出生日期
        string birthday = string.Format("{0}-{1}-{2}", date.Year, date.Month, date.Day);
        string email = this.txtEmail.Text.Trim(); // 电子邮件

        string connString = "server=.;database=MySchool;uid=sa;pwd=sa;";
        using (SqlConnection conn = new SqlConnection(connString))
        {
        conn.Open();

        try
        {
        // 构建 SQL 语句
        StringBuilder sql = new StringBuilder();
        sql.AppendFormat("UPDATE [Student] SET [LoginPwd]='{0}'", pwd);
        sql.AppendFormat(" ,[StudentName]='{0}'", name);
        sql.AppendFormat(" ,[Sex]='{0}'", sex);
        sql.AppendFormat(" ,[GradeId]='{0}'", gradeId);
        sql.AppendFormat(" ,[Phone]='{0}'", phone);
        sql.AppendFormat(" ,[Address]='{0}'", address);
        sql.AppendFormat(" ,[BornDate]='{0}'", birthday);
        sql.AppendFormat(" ,[Email]='{0}'", email);
        sql.AppendFormat(" WHERE [StudentNo]={0}", this.StudentNo);

        // 创建command对象
        SqlCommand command = new SqlCommand(sql.ToString(), conn);



        // 执行命令
        int result = command.ExecuteNonQuery();

        // 根据操作结果给出提示信息
        if (result == 1)
        {
        success = true;
        }
        }
        catch (Exception ex)
        {
        success = false;
        }
        }
        return success;
        }

        //点击 事件
        private void btnEdit_Click(object sender, EventArgs e)
        {
        if(CheckInput())//验证
        {
        if(UpdateStudent())//修改
        {
        MessageBox.Show("修改成功!");
        }
        else
        {
        MessageBox.Show("修改失败!");
        }
        }
        }
    5. 修改成功后,如何刷新查询信息列表ListView呢?

      分析:在查询信息窗体有加载学生信息的方法,如果在编辑页面能调用此方法,则可实现刷新效果。

      1. 在编辑界面定义一个成员变量,把查询窗体传入

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        public partial class FrmEditStudent : Form
        {
        public int StudentNo;//定义要修改学生的学号

        public FrmStudentList frmList;//查询窗体
        public FrmEditStudent()
        {
        InitializeComponent();
        }
        }
      2. 修改成功后调用查询窗体的查询方法

        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        12
        13
        14
        15
        private void btnEdit_Click(object sender, EventArgs e)
        {
        if(CheckInput())
        {
        if(UpdateStudent())
        {
        MessageBox.Show("修改成功!");
        frmList.GetStudentList();//调用刷新方法
        }
        else
        {
        MessageBox.Show("修改失败!");
        }
        }
        }
    6. 问题:同一个编辑界面现在实现了修改功能,如何在此界面实现新增学员功能?

      同一界面实现二个不同操作,如何实现?由学生完成,老师提供思路~

图片控件PictureBox

  1. 如何在窗体上显示图片:

    1714983850644

  2. 使用PictureBox控件,可以在窗体显示图片:

    属性:

    属性名称 说 明
    Image 在控件中显示的图像
    SizeMode 如何处理图像和控件的大小关系

    1714983974330

定时器控件Timer

  1. 定时器控件 (Timer) 的属性和事件

    属性名称 说 明
    Interval 事件发生的频率,以毫秒为单位
    Enabled 是否定时引发事件
    事件名称 说 明
    Tick 定时发生的事件

    注意事项:

    如果发现Timer控件不起作用,检查Enabled属性是否设置为True。

  2. 案例,用Timer控件实现计时器操作

    1. 如图所示:

      1714985183348

    2. timer事件

      1
      2
      3
      4
      private void timer1_Tick(object sender, EventArgs e)
      {
      lblTime.Text = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
      }
    3. 思考,用Timer和PictureBox控件实现多张图片自己切换功能。(由学员先完成,后讲解过程)