3.4 课程数据维护
3.4.1 设计课程信息窗体
(1)在“解决方案资源管理器”中双击“dsXk.xsd”编辑数据集。
(2)在“服务器资源管理器”中展开“数据连接”下的“home\sqlexpress.Xk.dbo”,展开“表”,将“Course”拖放到数据集的设计界面中。
(3)在项目中添加新的Windows窗体,命名为“frmCourse”。
(4)将窗体拉到适当大小,设置窗体的Text属性为“课程信息”。
(5)打开“数据源”,如果看不到,可选择“数据”菜单下的“显示数据源”命令。
(6)如图3-49所示,在“数据源”中确保Course左边的图标为“详细信息”状态,如果不是,可单击下拉按钮后选择“详细信息”选项。
图3-49 设置Course为“详细信息”方式
(7)在“数据源”中拖放“Course”到frmCourse窗体中。
(8)在主窗体中加入调用课程信息窗体的代码。在“解决方案资源管理器”中双击“frmMain”,打开该窗体的设计界面。双击“课程信息”菜单,为该菜单编写Click事件,代码如下。
private void课程信息ToolStripMenuItem_Click(object sender, EventArgs e) { frmCourse f = new frmCourse(); f.MdiParent = this; f.Show(); }
(9)切换到frmCourse的设计界面,如图3-50所示,调整各Label的Text属性,使界面更为友好。
图3-50 设置各Label的Text属性
(10)在主窗体中单击“课程信息”菜单,运行效果如图3-51所示。
图3-51 课程信息窗体的运行效果
3.4.2 维护课程数据
(1)删除courseBindingNavigator中的、、按钮。如图3-52所示,右击相应图标,选择“删除”命令即可。
我们保留前后导航的命令,以便自己控制增、删、改等操作。
图3-52 删除courseBindingNavigator中的按钮
(2)为方便后面代码控制,我们将窗体上的Label和TextBox控件都放入一个GroupBox控件中。
在“工具箱”的“容器”面板中将“GroupBox”控件拖放到窗体中。调整一下大小,使其能容纳准备放进来的控件。设置GroupBox的Text属性为空(清除掉原内容),将Name属性设置为“gbEdit”,现在的界面如图3-53所示。
图3-53 放置GroupBox
(3)如图3-54所示,将相关的Label和Text拖放到GroupBox中,并适当调整GroupBox及窗体的大小和位置。
图3-54 将Label和Text拖放到GroupBox中
(4)在“工具箱”的“菜单和工具栏”面板中,将“ToolStrip”控件拖放到窗体中。
(5)如图3-55所示,单击“ToolStrip任务”标志,设置其Dock属性为“Bottom”。
图3-55 设置ToolStrip的Dock属性为“Bottom”
(6)将该ToolStrip的Name属性设置为“tsControl”。
(7)如图3-56所示,在ToolStrip中添加5个Button。
(8)为ToolStrip中新添加的5个Button指定Image,读者可在资源文件夹中找一些图片,也可指定为自己喜欢的图片。
(9)将5个Button的Text属性分别指定为“新增”、“修改”、“删除”、“保存”、“放弃”。
(10)将5个Button的DisplayStyle属性都设置为“ImageAndText”。
(11)将5个Button的Name属性分别设置为tsbInsert、tsbEdit、tsbDelete、tsbSave、tsbCancel。
(12)将“保存”、“放弃”两个Button和GroupBox的Enabled属性设置为“False”。
图3-56 在ToolStrip中添加5个Button
这5个按钮以后将分别完成新增、修改、删除、保存、放弃的任务,现在设计好的界面如图3-57所示。
图3-57 添加增删改等按钮
(13)将GroupBox(gbEdit)的Enabled属性设置为“False”,表示最开始GroupBox里面的控件都设置为不可编辑状态。
(14)切换到Course的代码页,编写如下自定义方法如下。该方法将数据导航条、GroupBox、新增、修改、删除、保存、放弃的Enabled状态取反,即原来为“True”的将变为“False”,原来为“False”的将变为“True”。
private void ChangeEnabledState() { courseBindingNavigator.Enabled = !courseBindingNavigator.Enabled; gbEdit.Enabled = !gbEdit.Enabled; foreach (ToolStripButton b in tsControl.Items) { b.Enabled = !b.Enabled; } }
(15)双击“新增”按钮,生成Click事件框架,为其编写代码如下。
private void tsbInsert_Click(object sender, EventArgs e) { ChangeEnabledState(); courseBindingSource.AddNew(); couNoTextBox.Focus(); }
本段代码功能如下。
① 切换Enabled状态。
② 调用courseBindingSource的AddNew方法,在数据集中添加一条新的数据行。
③ 将光标定位到“课程代码”文本框中。
(16)类似地,为“修改”按钮编写其Click事件代码如下。
private void tsbEdit_Click(object sender, EventArgs e) { ChangeEnabledState(); couNoTextBox.Focus(); }
本段代码功能如下。
① 切换Enabled状态,这样就已经可以修改当前数据行的数据了。
② 将光标定位到“课程代码”文本框中。
(17)为“保存”按钮编写其Click事件代码如下。
private void tsbSave_Click(object sender, EventArgs e) { ChangeEnabledState(); this.Validate(); this.courseBindingSource.EndEdit(); this.tableAdapterManager.UpdateAll(this.dsXk); }
本段代码功能如下。
① 切换Enabled回到原来的状态。
② 验证数据的合法性。
③ 结束编辑。
④ 将数据集中的数据更新到数据库中。
(18)为“放弃”按钮编写其Click事件代码如下。
private void tsbCancel_Click(object sender, EventArgs e) { ChangeEnabledState(); this.courseBindingSource.CancelEdit(); }
本段代码功能如下。
① 切换Enabled回到原来的状态。
② 取消所做的修改。
(19)为“删除”按钮编写其Click事件代码如下。
private void tsbDelete_Click(object sender, EventArgs e) { if (courseBindingSource.Current != null) { if (MessageBox.Show("确实要删除吗?", "确认", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes) { courseBindingSource.RemoveCurrent(); this.tableAdapterManager.UpdateAll(this.dsXk); } } }
本段代码功能如下。
① 先判断当前是否有数据,如果有,询问用户是否确认,如果确认,则移除当前行。
② 将数据集的变化更新到数据库中。
(20)在主窗体中单击“课程信息”菜单,运行效果如图3-58所示。
图3-58 课程信息运行效果
(21)在不违反数据库相关约束规则的前提下,可做如下测试。
① 单击“新增”按钮,如图3-59所示,注意各控件的Enabled状态发生了变化。我们就是以此来控制用户的操作方式的。
图3-59 添加数据
② 自行录入测试数据,单击“保存”按钮,在数据库中验证是否加入了该数据。注意各控件的Enabled状态回到了原来的状态。
③ 单击“修改”按钮修改数据,单击“保存”按钮,在数据库中验证是否修改了该数据。
④ 单击“删除”按钮,如图3-60所示,出现确认删除对话框,单击“是”按钮,在数据库中验证是否删除了该数据。
图3-60 确认是否删除