第五章:实现Windows程序的数据更新
第五章:实现Windows程序的数据更新
本章目标
- 使用ADO.NET操作数据
- 使用PictureBox控件显示图片
- 使用Timer控件实现定时操作
本章内容
修改信息
问题:在上一章内容是讲到通过ListView将查询出来的信息展示出来,那么要修改选中的数据怎么实现呢?
具体分析:
添加快捷菜单,实现右键修改操作
获得选中学生的学号,将学员传入到编辑学生信息窗体
弹出编辑学生用户窗体
- 显示学生信息
- 保存修改后的信息
具体实现步骤:
在上一章内容中完成如上图所示功能
完成编辑页面的布局
在编辑窗体中设置一个属性,来保存学生学号
1
2
3
4
5
6
7
8public partial class FrmEditStudent : Form
{
public int StudentNo;//定义要修改学生的学号
public FrmEditStudent()
{
InitializeComponent();
}
}右键修改操作,获取要修改的学生学号
1
2
3
4
5
6
7
8
9
10
11
12
13
14private 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();
}在编辑界面,根据传入的学号,在加载事件中查询出学生的基本信息,绑定在控件中
在编辑界面先加载年级,第二章有讲解过:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17public 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;//将表格数据绑定到下拉列表的数据源里
}
}在加载学生信息
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
39public 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();
}
}编辑界面加载事件调用以上二个方法:
1
2
3
4
5private void FrmEditStudent_Load(object sender, EventArgs e)
{
LoadGrade();//加载年级
GetStudentByNo();//加载学生信息
}根据学号信息学生信息
非空验证:
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
48public 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;
}实现修改操作:
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("修改失败!");
}
}
}
修改成功后,如何刷新查询信息列表ListView呢?
分析:在查询信息窗体有加载学生信息的方法,如果在编辑页面能调用此方法,则可实现刷新效果。
在编辑界面定义一个成员变量,把查询窗体传入
1
2
3
4
5
6
7
8
9
10public partial class FrmEditStudent : Form
{
public int StudentNo;//定义要修改学生的学号
public FrmStudentList frmList;//查询窗体
public FrmEditStudent()
{
InitializeComponent();
}
}修改成功后调用查询窗体的查询方法
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15private void btnEdit_Click(object sender, EventArgs e)
{
if(CheckInput())
{
if(UpdateStudent())
{
MessageBox.Show("修改成功!");
frmList.GetStudentList();//调用刷新方法
}
else
{
MessageBox.Show("修改失败!");
}
}
}
问题:同一个编辑界面现在实现了修改功能,如何在此界面实现新增学员功能?
同一界面实现二个不同操作,如何实现?由学生完成,老师提供思路~
图片控件PictureBox
如何在窗体上显示图片:
使用PictureBox控件,可以在窗体显示图片:
属性:
属性名称 说 明 Image 在控件中显示的图像 SizeMode 如何处理图像和控件的大小关系
定时器控件Timer
定时器控件 (Timer) 的属性和事件
属性名称 说 明 Interval 事件发生的频率,以毫秒为单位 Enabled 是否定时引发事件 事件名称 说 明 Tick 定时发生的事件 注意事项:
如果发现Timer控件不起作用,检查Enabled属性是否设置为True。
案例,用Timer控件实现计时器操作
如图所示:
timer事件
1
2
3
4private void timer1_Tick(object sender, EventArgs e)
{
lblTime.Text = DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss");
}思考,用Timer和PictureBox控件实现多张图片自己切换功能。(由学员先完成,后讲解过程)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 广创科技教育-Blog!
评论