12月23日(星期一):(一)在今天我们学习了如何创建Windows应用程序:单击“文件”——选择“新建”——选择“项目”——选择“Windows应用程序”,在此界面中可以设置项目名称、存储位置等,然后单击“添加”,项目新建成功。。创建Windows应用程序后会自动生成一个名为Form1的窗体,一般情况下我们将它删除,自行新建新窗体。(二)然后我们学习了如何在已经创建好的项目中创建窗体:右键单击项目——单击“添加”——选择“新建项”——在此窗口中选择“Windows”窗体,添加的默认名字为Form2,Form3等,我们最好将名称改为“数据库表名+Form”方便记忆,然后单击“添加”,窗体新建成功。实践后我们了解到在一个项目中我们可以创建多个窗体,如果想运行哪个窗体,则需要总在该项目的“Program.cs”文件中,将“Application.Run(newMainForm());”中的“MainForm()”改成对应的窗体名称。(三)我们在了解了项目需求后实现了父窗体以及子窗体的设定:由于我们需要建立的是一个有菜单,有多项功能,能打开多个窗体的项目,所以我们需要一个主窗体,以及多个下属功能窗体,也就是一个父窗体,以及多个子窗体。我们需要一个窗体作为容器成为基类或父窗体,另一个窗体作为模板,也叫子窗体。在父窗体中可以打开多个文档,每个文档都是由一个单独的子窗体显示,所有的子窗体都是类似的,可以使用窗体的模板来创建,从类的角度来看所有的子窗体都是一个类的不同实例。创建父窗体的方法非常简单,即为将想要设定的窗体的“IsMdiContainer”属性值设为“True”,此时窗体的背景变为灰色,该窗体就变为父窗体。然后就可以在此窗体中添加菜单从而实现调用其他窗体的功能。(四)我们在创建好窗体后熟悉了环境中的几项比较重要的工具窗口:在创建好窗体之后我们开始在子窗体中进行界面设计,首先是熟悉环境的属性界面,在软件右侧有两个工具栏,分别是“解决方案资源管理器”和“属性”窗口。这两项窗口都可以在视图中找到后调出。在“解决方案资源管理器”中我们可以查看当前打开的项目的文件,双击即可打开对应文件。在“属性”中我们可以查看选中的窗体或者选中的各个控件的各项属性值,同时可以对各项属性进行调整。我们可以在“属性”栏中将属性名按照字母顺序排序以方便查找,我们还可以查找对应事件并进行修改。而在界面左侧则有一个“工具箱”,在工具箱中我们可以找到几乎所有我们所需要的控件、容器、工具栏等。只要单击工具箱中需要的控件,再单击窗体就可以添加控件成功。我们也可以用容器中控件来规划窗体,如我们可以使用“SplitContainer”空间来将窗体分割成两部分,在两部分中分别添加其他空间,进行不同的内容的添加。(五)在今天下午的课程中我们学习了如何调整窗体的各项基本属性:首先我们学习了如何为窗体的标题栏修改文字内容,在属性窗口中,我们找到“Text”属性,然后输入想显示的内容,如我们首先设计了工作信息窗体,所以在“Text”属性右侧框中输入“工作信息管理”字样。然后我们了解了确定窗体的初赛可视状态属性,在属性栏中找到“WindowsState”属性,在此我们可以选择“Minimized”也就是打开时最小化显示,“Maximized”打开时最大化显示以及“Normal”标准话显示。12月24日(星期二):(一)今天上午我们对窗体属性继续进行了了解:如“MaximizeBox”属性用来确定窗体标题栏的右上角是否有最大化框;“MinimizeBox”属性用来确定窗体标题栏的右上角是否有最小化框;“Opacity”属性用来设置窗体的不透明度;“ShowInTaskbar”属性用来确定窗体是否出现在Windows任务栏中;“StartPosition”属性用来确定窗体第一次出现的位置;“TopMost”属性用来指示窗体是否始终显示在此属性未设置为“True”的所有其他窗体之上。(二)然后我们设计了“工作信息管理系统”的界面:使用“SplitContainer”控件将窗体分为两部分,左侧作为数据输入区,右侧为数据显示区。在右侧添加了“FataGridView”数据网格显示控件。并命名为“dgvJobs”,设置他的“Dock”属性为“Fill”,此属性是为了定义要绑定的容器的控件边框。单击控件右上角小箭头,“选择数据源”——“添加项目数据源”——在“选择数据源类型”中选择“数据库”并单击“下一步”——连接“pubs”表——填入用户名和密码,然后选择“Jobs”表连接。单击“编辑列”——选定列,然后将列名修改为中文名。在左侧添加“Label”标签控件、“Text”文本框控件以及“Botton”按钮控件来实现数据录入以及单击实现功能的功能。在添加好后分别将各个控件改名以方便以后使用。设定每个控件的“Anchor”属性,该属性定义控件绑定到的容器的边缘,当控件锚定到某个边缘时,与指定边缘最接近的控件边缘与指定边缘之间的距离将保持不变。设定此属性后,在使用该窗体时,各个控件的位置将固定,方便、美观。在此,我们将“工作编号”栏的“ReadOnly”属性设置为“True”,以控制能否更改编辑控件中的文本。(三)实现“添加”按钮的功能:双击窗体中的一个按钮就可以生成一个事件,在“添加”事件中老师主要讲解使用“try-catch”对工作等级进行验证,如果输入的工作等级与要求不符,则执行“catch”中语句,在此老师教我们使用了“txtMinlvl.Focus();”语句和“txtMinlvl.SelectAll();”语句,“txtMinlvl.Focus();”这个语句用于将光标的焦点转到最小工作等级处,这个语句的使用可以方便用户找到出错位置,“txtMinlvl.SelectAll();”可以选中文本框中全部文字,方便用户的重新输入,可以加强用户体验,这种为用户方便着想的设计在以后的程序设计中是十分重要的,只要在编程时回忆自己使用某些软件的体验就可以了解用户需求,将程序设计的更加合理,更加人性化。同时,工作等级文本框有多种方法来限制用户输入,可以在语句中做判断,我们也可以使用“NumericUpDown”控件,这个控件限制了用户在框中只能输入数字,不能输入其他字符。这个控件还可以设定初始值。我们在“catch”中还使用了“MessageBox.Show();”语句,使用这个语句可以弹出一个窗口,显示想要显示的文本信息,在此我们用来提示用户添加失败的原因“最低等级是0-255之间的数字。”。(四)实现“取消”按钮的功能:在“btnCancel_Click”事件中,我们将文本框值全部赋值为空,以达到当单击“取消”按钮的时候,清空所有文本框中已经输入的文字的功能。如果使用了“NumericUpDown”控件,则需要将此处赋值为“0”。12月25日(星期三):(一)今天首先实现了“修改”按钮的功能:在实现“修改”功能之前,首先我们需要做的是将右侧的数据显示到左侧的文本框中,然后我们才能方便进行修改和删除。我们希望做到的效果是在双击右侧数据条头部时,可以将数据提取出来然后显示在左侧,所以我们创建了一个“dgvJobs_RowHeaderMouseDoubleClick”事件,提取了数据库中的数据。然后我们通过定义局部变量来判断想要修改成的工作编号格式是否符合要求,用“if”语句判断是否有此工作编号,然后实现了修改功能。(二)在测试中出现了一个问题:在我准备执行时出现了“sa登录失败”的错误,我在“JobsForm_Load”事件中添加了“this.jobsTableAdapter.Connection.ConnectionString=server=.;user=sa;password=123456;database=pubs;”语句后就解决了问题,其他同学也有遇到这个问题的,他们提供了另一种方法给我参考,就是重新绑定数据源,在登录数据库时使用“Windows验证”登录。(三)然后我们实现了“删除”功能:删除功能和修改功能类似,很多代码可以公用,只需要简单的复制粘贴,然后在修改一些值就可以直接使用,在此我也了解到有得时候编程序不需要一行一行的重复编写,有的时候只要你记住以前自己编写过的代码,并理解其中的道理就可以直接使用。在这里我们就用来同样的代码对工作编号的格式和是否存在该工作编号进行了判断,如果判断后没有异常则删除。(四)实现“保存”功能:在实现了基本的增删改功能之后,我们经过测试基本没有错误,但是此处的功能实现只是局限于左侧文本框与右侧数据显示区的交互,并没有真正的实现于数据库中,所以每次我们执行完操作以后,一旦关闭了窗体,再次运行窗体时,之前添加或修改的数据并没有显示出来。所以我们需要完成一个保存功能,来将修改的结果同步到数据库中。我们编写了“btnSave_Click”事件来实现保存功能。定义变量“count”来计数,实现更新数据库中数据。在这个地方老师又特殊强调了一个“pubsDataSet.RejectChanges();”,也就是回滚功能,这个语句在判断是否保存成功的语句中实现。我们进行的设计是,如果保存成功,显示“保存成功”,并显示受影响的记录的条数,条数的计数就是通过“count”来实现的。如果保存不成功,我们会将右侧数据还原到点击“添加”或“修改”按钮之前的状态,以方便用户重新操作。(五)实现“查找”和“取消查找”功能:查找功能我们使用“jobsBindingSource.Filter”语句实现,“Filter”用于获取或设置用于筛选查看哪些行的表达式。我们使用SQL语句进行模糊查询。取消查询的功能实现起来也很简单,只需要将查询文本框中的文本内容清空,然后将“jobsBindingSource.Filter”也清空即可12月26日(星期四):(一)对以前上课实训内容的总结:在此之前基本已经将最简单的“Jobs”表的增删改查功能实现,在以后的很多窗体的制作中都可以直接复制“JobsForm”中的内容。(二)“EmployeeForm”窗体的设计:雇员信息管理窗体的界面设计与工作信息管理窗体的基本设计步骤类似,在此增添了两个新的控件,“ComboBox”控件和“DateTimePicker”控件。“ComboBox”控件可以显示一个可编辑的文本框,其中包含一个允许值下拉列表。在这个控件中我们可以绑定数据源,对可选择项进行限制,只需要单击控件右上角小箭头,选中“使用数据绑定项”复选框,然后选择数据源,之后设定显示成员和值成员即可设定。“DateTimePicker”控件可以限制用户输入的格式必须是日期型。右侧的数据显示栏与“JobsForm”略有不同是我们可以编辑列,在设计栏中将“ColumnType”属性值设置成“DataGridViewComboBoxColumn”,然后我们就会发现“数据”栏中会出现多项属性,只要进行适当的设定,就可以使“job_id”等列显示“job_desc”而非“job_id”以方便用户查看相关信息。(三)“EmployeeForm”的代码编辑:为了使用户有舒适的体验,我们将“PubId”和“JobId”的文本框中的初始值设置为“-请选择-”。将查询入职日期的最小值文本框的初始值设置为“1753-1-1”,最大值文本框的初始值设置为“Now”,也就是使用程序当天日期。由于EmpId有检查约束,所以在添加功能代码中对输入的值进行了判断。在代码中我们还添加了一个全局变量“oldEmpId”,用来保存原主键“EmpId”的值,以方便在修改是可以对主键进行修改,防止在改变主键后无法找到对应的整条数据信息。(四)查找功能:在“EmployeeForm”窗体中我们实现了根据多种条件进行查找,老师教我们用“AND”连接多个查询条件,而在查询条件首句我们添加了一句“stringstr=1=1;”代码,这句话的作用是当首个查询条件为空时,不使“AND”打头。(五)基本表已经完成,开始进行主窗体的设计:创建“MainForm”窗体,将窗体的“IsMdiContainer