零点起飞学C#之图书管理系统.pptx_第1页
零点起飞学C#之图书管理系统.pptx_第2页
零点起飞学C#之图书管理系统.pptx_第3页
零点起飞学C#之图书管理系统.pptx_第4页
零点起飞学C#之图书管理系统.pptx_第5页
已阅读5页,还剩43页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第25章 图书管理系统,图书管理系统是当前最为流行的管理系统之一,它包括登录、主窗口、图书分类管理、书籍管理、借阅书籍、归还书籍、浏览书籍等功能。本章将讲解使用Visual Studio 2010开发图书管理系统(应用程序的名称为“LibraryManager”,数据库的名称为“LibraryManagerDB”,数据库版本为SQL Server 2012)的方法。,25.1 系统总体设计,软件的开发流程是需求分析、概要设计、详细设计、编码、测试、交付。我们做图书管理系统,需求分析已经确定。本节我们来做概要设计,即系统的总体设计。主要包括系统功能设计、图书管理系统组成、数据库设计、应用程序入口、应用程序全局变量。,25.1.1 系统功能设计,图书管理系统主要有两大模块:管理员模块和学生、教师模块。管理员模块是为管理员提供服务,它的功能如下: 管理员登录:验证管理员的身份是否合法。 主窗口:管理员的操作主窗口。 分类管理:实现书籍分类的管理功能,包括添加分类、修改分类、删除分类等功能。 书籍管理:实现书籍的管理功能,包括添加书籍、修改书籍和删除书籍等功能。 借阅书籍:实现借阅书籍的功能。 查看借阅人:实现查看某一本书籍的所有借阅人的功能。,学生或老师模块为学生或老师提供服务,它提供的功能如下: 学生或老师登录:验证学生或老师的身份是否合法。 主窗口:学生或老师的操作主窗口。 归还书籍:实现归还书籍的功能。 查看书籍信息:查看指定书籍的详细信息。 浏览书籍:以列表方式、按照书籍分类浏览书籍。 借阅书籍:实现借阅书籍的功能。,25.1.2 图书管理系统组成,在本系统中,图书管理系统应用程序的名称为LibraryManager。在Visual Studio 2010的“解决方案资源管理器”面板中查看LibraryManager应用程序。 LibraryManager应用程序的组成元素说明如下。 Admin文件夹:包括与管理员的功能相关的窗体,即书籍管理和分类管理。 Data文件夹:包括数据库实体类文件Library ManagerDB.cs。 Tool.cs文件:操作节点信息。 LibrarySystem.cs文件:设置登录用户的ID值。 BookInfoForm.cs窗体:查看书籍信息。,BrowserForm.cs窗体:浏览书籍。 LendForm.cs窗体:借阅书籍。 LendUserInfoForm.cs窗体:查看借阅人信息。 LoginForm.cs窗体:登录窗口。 MainForm.cs窗体:管理员主窗口。 UserForm.cs窗体:学生或教师主窗口。 Program.cs文件:图书管理系统应用程序主入口文件。 app.config文件:配置数据库连接字符串等信息。,25.1.3 数据库设计,在本系统中,使用的数据库名称为LibraryManagerDB。在这使用的是Microsoft SQL Server 2012数据库。LibraryManagerDB数据库包括6个表,分别是:Category、Group、User、Book、BookCategory和UserBook表。 1Category表 Category表保存分类的信息。 2Group表 Group表保存组的信息。,3User表 User表保存用户的信息。 4Book表 Book表保存书籍的信息。 5BookCategory表 BookCategory表保存书籍所属分类关系的信息。 6UserBook表 UserBook表保存用户所借阅的书籍关系的信息。,25.1.4 数据库实体类设计,在本系统中,为数据库LibraryManagerDB创建DBML文件“LibraryManagerDB.dbml“。将数据库中的Category、Group、User、Book、BookCategory和UserBook表添加到该文件中。,25.1.5 应用程序主入口,应用程序的入口为Main()函数,位于Program.cs文件中。在Program.cs文件中定义名称为Program.cs的静态类和静态的Main()方法。在Main()方法中调用Application类的静态方法Run()运行第一个窗体,即登录窗体。 注意:static void Main()静态方法为应用程序的主入口。,25.1.6 应用程序全局变量,在本系统中,创建了一个LibrarySystem.cs文件。在该文件中创建了一个名称为LibrarySystem的类,该类定义了一个全局静态变量UserID。变量UserID用来保存登录用户的ID值。,25.2 管理员模块,管理员模块包括登录、主窗体、分类管理、书籍管理、借阅书籍等功能。管理员可以通过主窗体查看和浏览书籍,以及书籍的借阅情况。借阅书籍窗体可以实现借阅书籍的功能。本节主要介绍这些功能模块的具体实现。,25.2.1 管理员登录,管理员登录功能由LoginForm.cs窗体实现。管理员在登录窗体可以输入用户名和密码,输入正确后,单击“登录”按钮即可登录成功,单击“取消”按钮可以关闭窗体。LoginForm.cs窗体的标题为“图书管理系统”,该窗体包括2个TextBox控件和2个Button控件。 运行图书管理系统之后,出现的第一个窗口就是LoginForm.cs窗体。 实现LoginForm.cs窗体的具体步骤如下: (1)LoginForm.cs窗体位于LibraryManager目录下,它所在的命名空间为Library Manager,同时还引入了2个命名空间:LibraryManager.Component和LibraryManager.Data。 (2)实现登录功能。用户单击“登录”按钮可以登录图书管理系统,该功能由btnLogin控件的Click事件btnLogin_Click(object sender,EventArgs e)实现,具体步骤如下: 创建LibraryManagerDB数据库的数据上下文的实例db。该实例使用保存在资源文件中的连接字符串LibraryManagerDBConnectionString。,创建“from u in db.User where u.Username = tbUsername.Text.Trim() ”查询表达式,并保存为users变量。该查询表达式根据用户名和密码查询用户的信息。 如果users变量包含查询结果,则获取结果集中的第一个实例,并保存为user变量。 设置LibrarySystem.UserID静态变量的值,它保存当前登录用户的ID值。 创建switch语句,根据用户所属的组打开不同的主窗口。如果用户属于管理员组(user实例的GroupID属性的值为1),则打开MainForm.cs窗体。如果用户属于教师或学生组(user实例的GroupID属性的值为2或3),则打开UserForm.cs窗体。 调用Hide()方法隐藏LoginForm.cs窗体。 (3)实现关闭窗口功能。用户单击“关闭”按钮可以关闭该窗口,该功能由btnCancel控件的Click事件btnCancel_Click(object sender,EventArgs e)实现。,25.2.2 主窗口,管理员主窗口由MainForm.cs窗体实现。主窗口中以列表的形式显示指定分类下的书籍。管理员单击“分类管理”图标打开分类管理的窗体,单击“添加新书籍”按钮可以打开书籍管理窗体,单击“借阅书籍”按钮可以打开借阅书籍的窗体。MainForm.cs窗体的标题为“图书管理系统”。该窗体包括1个PictureBox控件、1个ComboBox控件、1个DataGridView控件和2个Button控件。 运行图书管理系统,管理员登录成功之后出现的第一个窗口就是MainForm.cs窗体。 实现MainForm.cs窗体的具体步骤如下: (1)MainForm.cs窗体位于LibraryManager目录下,它所在的命名空间为Library Manager,同时还引入了3个命名空间:LibraryManager.Component、LibraryManager.Data和LibraryManager.Admin。 (2)窗体数据初始化。窗体数据初始化主要实现两个功能:初始化cbCategory和dgvBook控件的数据。这两个功能均由MainForm_Load(object sender,EventArgs e)事件和ShowData(int categoryID)方法共同实现。 cbCategory控件以列表、层次结构方式显示分类。MainForm_Load(object sender,EventArgs e)事件调用Tool类的InitCategoryData(TreeView tv,params int categoryIDValues)静态方法初始化cbCategory控件的数据。,dgvBook控件显示cbCategory控件中的当前分类下的所有书籍。它包含9个列。 ShowData(int categoryID)方法初始化dgvBook控件的数据,该方法的具体步骤如下: 创建LibraryManagerDB数据库的数据上下文的实例db。该实例使用保存在资源文件中的连接字符串LibraryManagerDBConnectionString。 创建“from b in db.Book join bc in db.BookCategory on b.ID equals bc.BookID where bc.CategoryID = categoryID orderby b.PublishDate descending select b;”查询表达式,并保存为result变量。该查询表达式根据分类查询该分类下的所有书籍的信息。 设置result查询表达式的查询结果作为dgvBook控件的数据源。 设置dgvBook控件的各个列的显示顺序。 设置dgvBook控件的每一个列不能排序。 设置每一行的行标题,并根据书籍的已借数量,设置每一行中“删除”列显示的链接文本。 根据书籍的状态和库存数量,设置“借阅书籍”按钮的可用性。,(3)dgvBook控件的事件。dgvBook控件的事件共包括以下两个事件。 private void dgvBook_CellContentClick(object sender,DataGridViewCellEventArgs e)事件:当用户选择dgvBook控件的单元格中的内容时触发该事件。 private void dgvBook_RowHeaderMouseClick(object sender,DataGridViewCellMouse EventArgs e)事件:当用户选择dgvBook控件的行标题时触发该事件。 当用户选择dgvBook控件中的“已借数量”、“更新”和“删除”列中的每一个单元格内容时,都触发dgvBook_CellContentClick(object sender,DataGridViewCellEventArgs e)事件。具体步骤如下: 判断列的索引是否合法。 如果被选择的单元格属于“已借数量”列(即列的Name属性的值为cBorrowNumber)时,事件获取当前行的书籍的ID属性的值,并打开LendUserInfoForm.cs窗体,可以查看借阅当前书籍的用户信息数量,同时设置“借阅书籍”按钮的可用性。,如果被选择的单元格属于“更新”列(即列的Name属性的值为“cUpdate”)时,事件获取当前行的书籍的ID属性的值,并打开BookForm.cs窗体,可以更新当前行的书籍的信息。更新书籍的信息之后,将调用ShowData(int categoryID)方法重新显示dgvBook控件的数据。 如果被选择的单元格属于“删除”列(即列的Name属性的值为cDelete)时,事件弹出一个“删除书籍询问对话框”对话框。如果用户单击“确定”按钮,则获取当前行的书籍的ID属性的值,并使用LINQ从数据库中删除当前行的书籍。如果单击“取消”按钮,则取消上述删除操作。其中,deleteBooks查询表达式保存被删除的书籍。如果删除书籍成功,则弹出信息提示对话框。 当用户选择dgvBook控件中的每一行标题时,都将触发dgvBook_RowHeaderMouse Click(object sender, DataGridViewCellMouseEventArgs e)事件。该事件首先判断行索引是否合法,然后获取当前行书籍的状态和库存。,(4)按钮的事件设计。当用户选择cbCategoy控件的每一个下拉选项时,cbCategoy_SelectedIndexChanged(object sender,EventArgs e)。该事件调用ShowData(int categoryID)方法(categoryID参数的值就是cbCategory控件的选择项的ID值,它指示当前被选择的分类)显示当前选择项(分类)下的所有书籍。 当用户选择“添加新书籍”按钮(btnAdd控件)时,将触发btnAdd_Click (object sender, EventArgs e)。该事件以对话框形式打开BookForm.cs窗体(书籍管理窗口)。当用户操作BookForm.cs窗体完成,并关闭窗体之后,该事件调用ShowData(int categoryID)方法(categoryID参数的值就是cbCategory控件的选择项的ID值,它指示当前被选择的分类)重新显示当前选择项(分类)下的所有书籍。 当用户选择dgvBook控件中的一本书籍并单击“借阅书籍”按钮(btnLend控件)时,触发btnLend_Click(object sender, EventArgs e)。该事件以对话框形式打开LendForm.cs窗体(借阅书籍窗口),并将被选书籍的ID值设置为该窗体的BookID属性的值。,当用户操作LendForm.cs窗体完成,并关闭窗体之后,该事件调用ShowData(int category ID)方法(categoryID参数的值就是cbCategory控件的选择项的ID值,它指示当前被选择的分类)重新显示当前选择项(分类)下的所有书籍。 当用户单击“分类管理”图标(pbCategory控件)时,触发Click事件pbCategory_ Click(object sender, EventArgs e)。该事件以对话框形式打开CategoryForm.cs窗体(分类管理窗口)。 当用户关闭当前窗体时,触发MainForm_FormClosed(object sender,FormClosedEventArgs e)事件。该事件调用Application类的Exit()方法退出应用程序。 注意:pLeft控件都定义了Panit事件pLeft_Paint(object sender,PaintEventArgs e)。该事件为pLeft控件的右边框绘制为3D样式。DrawBorder3D()方法用来绘制3D边框。e.Graphics参数表示Graphics对象,e.ClipRectangle参数表示pLeft控件的矩形框,Border3DStyle.Etched参数指定边框的样式为3D样式,Border3DSide.Right参数指定绘制哪个边框。 同样地,pBottom控件为其上边框也绘制了3D边框。它的Panit事件为pBottom_Paint (object sender, PaintEventArgs e)。,25.2.3 分类管理,分类管理功能由CategoryForm.cs窗体实现。管理员可以创建和维护书籍的分类树,如添加新的分类、修改分类名称、删除分类等。CategoryForm.cs窗体的标题为“图书类别管理”,该窗体包括1个TreeView控件、3个TextBox控件、2个Button控件。 管理员登录图书管理系统之后,在主窗口中单击“分类管理”图标,弹出“图书类别管理”窗口即为CategoryForm.cs窗体。 实现CategoryForm.cs窗体的具体步骤如下: (1)CategoryForm.cs窗体位于LibraryManager目录下,它所在的命名空间为Library Manager,同时还引入了2个命名空间:LibraryManager.Component和LibraryManager.Data。,(2)窗体数据初始化。窗体数据初始化主要初始化tvCategory控件的数据,并以树形结构显示分类,该功能由Category_Load(object sender,EventArgs e)事件调用Tool类的InitCategoryData(TreeView tv,ContextMenuStrip cmstv)静态方法实现。 (3)上下文菜单。CategoryForm.cs窗体定义了Name属性的值为cmstv的上下文菜单。cmstv上下文菜单共包括4个命令项:左移、右移、修改和删除,并定义了以下3个事件。 cmstv_Opened(object sender,EventArgs e)事件:当cmstv上下文菜单打开之后触发该事件。 tsmiUpdate_Click(object sender,EventArgs e)事件:选择“修改”命令触发该事件。 tsmiDelete_Click(object sender,EventArgs e)事件:选择 “删除”命令触发该事件。,当cmstv上下文菜单打开之后,将触发cmstv_Opened(object sender,EventArgs e)事件。该事件首先获取tvCategory控件的选择节点。如果为空,则中止该事件。否则,如果该选择节点的存在子节点或者父节点为空,则设置“删除”命令项不可用。 当选择“修改”命令项时,触发tsmiUpdate_Click(object sender,EventArgs e)事件。该事件首先获取tvCategory控件的选择节点,并保存为node变量。如果为空,则中止该事件,否则执行以下具体步骤。 设置node变量表示的节点的状态为编辑状态。 创建LibraryManagerDB数据库的数据上下文的实例db。 创建“from c in db.Category where c.ID.ToString() = node.Tag.ToString() select c;”查询表达式,并保存为result变量。该查询表达式从Category表中查找node变量表示的节点。,获取result变量的查询结果集合中的第一个元素,并获取该元素的Name和Desn属性的值,分别显示在tbName和tbDesn控件中。 设置“修改分类”按钮可用。 当选择“删除”命令项时,触发tsmiDelete_Click(object sender,EventArgs e)事件。该事件首先获取tvCategory控件选择的节点,并保存为node变量。如果为空,则中止该事件,否则执行以下具体步骤。 判断置node变量表示的节点的父节点是否为空。 创建LibraryManagerDB数据库的数据上下文的实例db。 创建“from c in db.Category where c.ID.ToString() = node.Tag.ToString() select c;”查询表达式,并保存为result变量。该查询表达式从Category表中查找node变量表示的节点。 删除result变量的查询结果集合中的所有元素,并提交到数据库。 删除node变量表示的节点。,(4)tvCategory控件的事件。tvCategory控件共包括以下3个事件。 tvCategory_NodeMouseClick(object sender,TreeNodeMouseClickEventArgs e)事件:单击tvCategory控件的节点时触发该事件。 tvCategory_BeforeLabelEdit(object sender,NodeLabelEditEventArgs e)事件:编辑tv Category控件的某一个节点之前触发该事件。 tvCategory_AfterLabelEdit(object sender,NodeLabelEditEventArgs e)事件:编辑tv Category控件的某一个节点之后触发该事件。 当用户选择tvCategory控件的节点时,将触发tvCategory_NodeMouseClick(object sender, TreeNodeMouseClickEventArgs e)事件。该事件设置当前被单击的节点为选择节点,并将其文本(Text属性的值)显示在tbParentName控件中。 当用户在编辑tvCategory控件的某一个节点之前,将触发tvCategory_BeforeLabel Edit(object sender, NodeLabelEditEventArgs e)事件。该事件的功能和tsmiUpdate_Click(object sender,EventArgs e)事件的功能非常相似,将在tbName和tbDesn控件中显示被编辑节点的名称和其父节点的名称。,当用户在编辑tvCategory控件的某一个节点之后,将触发tvCategory_AfterLabelEdit (object sender, NodeLabelEditEventArgs e)事件。该事件的具体步骤如下: 结束当前节点的编辑状态。 设置“修改分类”按钮不可用。 创建LibraryManagerDB数据库的数据上下文的实例db。 创建“from c in db.Category where c.ID.ToString() = e.Node.Tag.ToString() select c;”查询表达式,并保存为result变量。该查询表达式从Category表中查找node变量表示的节点。 使用foreach语句修改result变量的查询结果集合中所有元素的Name和Desn属性的值。 将上述修改提交到数据库。,(5)按钮的事件。用户可以在tbName和tbDesn控件中输入新分类的名称和简介,单击“添加子分类”按钮将该分类添加为tvCategory控件的当前选择节点(其名称显示在tbParentName控件中)的子节点。当用户单击“添加子分类”按钮时,将触发btnAddSub Node_Click(object sender, EventArgs e)事件。该事件实现上述功能,具体步骤如下: 获取tvCategory控件的当前选择节点,并保存为parentNode变量。如果parentNode变量为空,则显示提示信息。 创建LibraryManagerDB数据库的数据上下文的实例db。 创建Category类的实例c。 设置c实例的Name、ParentID和Desn属性的值。 调用SubmitChanges方法将c实例添加到数据库中。 创建新的子节点,并表示为node。 设置node变量的Text、ContextMenuStrip和Tag属性的值。 将node变量表示的节点添加为parentNode变量表示的节点的子节点。,当用户单击“修改分类”按钮时,将触发btnUpdateNode_Click(object sender,EventArgs e)事件。该事件实现修改tvCategory控件的当前选择节点的名称和简介的功能,具体步骤如下: 获取tvCategory控件的当前选择节点,并保存为node变量。如果node变量为空,则显示提示信息。 创建LibraryManagerDB数据库的数据上下文的实例db。 创建“from c in db.Category where c.ID.ToString() = node.Tag.ToString() select c;”查询表达式,并保存为result变量。该查询表达式从Category表中查找node变量表示的节点。 使用foreach语句修改result变量的查询结果集合中的所有元素的Name和Desn属性的值。 将上述修改提交到数据库。 将node变量表示的节点的文本(Text属性的值)修改为tbName控件的Text属性的值。,25.2.4 书籍管理,书籍管理功能由BookForm.cs窗体实现。管理员登录成功后在主窗口单击“添加新书籍”按钮即可打开书籍管理窗体。BookForm.cs窗体的标题为“书籍管理”,该窗体包括6个TextBox控件、1个ComboBox控件、1个DateTimePicker控件、1个PictureBox控件、1个RichTextBox控件、1个TreeView控件和3个Button控件。 管理员登录图书管理系统之后,在主窗口中单击“添加书籍”按钮,弹出“书籍管理”窗口即为BookForm.cs窗体。此时,该窗口实现添加书籍的功能。在主窗口的dgvBook控件中单击“更新”链接,打开“书籍管理”窗口。此时,该窗口实现修改书籍的功能。 实现BookForm.cs窗体的具体步骤如下:,(1)BookForm.cs窗体位于LibraryManager目录下,它所在的命名空间为Library Manager,同时引入3个命名空间:LibraryManager.Component、LibraryManager.Data和System.IO。 注意:BookForm类创建Random类的实例random,用来产生随机数(用在书籍的电子文档和封面图片的名称中)。 (2)窗体数据初始化。如果bookID变量的值大于0,则表示该窗体实现修改书籍的功能,否则表示该窗体实现添加书籍的功能。窗体数据初始化主要包括以下两个功能。 若该窗体实现添加书籍的功能,只需要初始化书籍分类数据(即tvCategory控件的数据)即可。 若该窗体实现修改书籍的功能,则首先需要显示被修改数据的信息,然后需要初始化书籍分类数据(即tvCategory控件的数据),并设置与被修改书籍相关的分类。,上述功能由BookForm_Load(object sender,EventArgs e)事件调用InitData(int bookID)方法实现。InitData(int bookID)方法首先判断bookID变量的值是否小于0。如果是,则调用Tool类的静态方法InitCategoryData(TreeView tv,params int categoryIDValues)初始化tvCategory控件的数据,并返回。如果不是,则执行以下步骤。 创建LibraryManagerDB数据库的数据上下文的实例db。该实例使用保存在资源文件中的连接字符串LibraryManagerDBConnectionString。 创建“from b in db.Book where b.ID = bookID select b;”查询表达式,并保存为result变量。该查询表达式从Book表中查询被显示的书籍。 如果result变量的结果集合中的对象数量大于0,则获取第一个对象,并保存为book变量。 获取book变量的值,并显示在当前窗体的控件中。,创建“from bc in db.BookCategory where bc.BookID = bookID select bc.CategoryID;”查询表达式,并保存为categoryIDValues变量。该查询表达式从BookCategory表中查询被显示的书籍相关的分类。 调用Tool类的InitCategoryData(TreeView tv,params int categoryIDValues)静态方法分类树,如果分类与当前书籍相关,则选中该分类。 根据bookID变量的值,设置btnSure按钮的Text属性的值。如果bookID变量的值小于0,则设置btnSure按钮的Text属性的值为“添加书籍”,否则设置为“修改书籍”。 (3)按钮的事件。用户单击“浏览”按钮或者“浏览图片”按钮时,都打开“浏览文件”对话框,同时,用户可以选择所需要的文件。该功能分别由btnBrowser_Click(object sender,EventArgs e)和btnBrowserPic_Click(object sender,EventArgs e)事件实现。 当用户单击“添加书籍”或者“修改书籍”按钮(btnSure控件)时,实现添加书籍或者修改书籍的功能。该功能由btnSure_Click(object sender,EventArgs e)事件实现,具体步骤如下: 判断用户输入的书籍数量是否正确。如果错误,则显示提示信息。,创建LibraryManagerDB数据库的数据上下文的实例db。该实例使用保存在资源文件中的连接字符串LibraryManagerDBConnectionString。 如果bookID变量的值小于0,则执行添加书籍的功能。此时,创建Book类的实例book,并设置该实例各个属性的值,调用SubmitChanges()方法提交到数据库。最后,调用SetBookCategory(LibraryManagerDBDataContext db,int bookID)方法设置与该书籍相关的分类。 如果bookID变量的值大于0,则执行修改书籍的功能。此时,使用Where子句获取被修改的书籍,并使用foreach语句修改书籍的各个属性的值,调用SubmitChanges()方法提交到数据库。最后,调用SetBookCategory(LibraryManagerDBDataContext db,int bookID)方法设置与该书籍相关的分类。,注意:btnSure_Click(object sender,EventArgs e)事件调用了2个辅助方法:CopyAccessory (string path)和SetBookCategory(LibraryManagerDBDataContext db,int bookID)。第1个方法将path参数指定的文件复制到指定目录,并返回文件的地址。第2个方法设置与指定书籍相关的分类,即指定书籍所属的分类。这2个方法的程序代码,在此不做介绍,读者可以参考附赠光盘的Admin/BookForm.cs文件。,25.2.5 借阅书籍,借阅书籍功能由LendForm.cs窗体实现。该窗体将指定书籍借阅给用户。管理员可以选择借阅书籍的用户。LendForm.cs窗体的标题为“借阅书籍”,该窗体包括5个TextBox控件、3个ComboBox控件、1个DateTimePicker控件、1个PictureBox控件、1个LinkLabel控件、1个RichTextBox控件、1个TreeView控件和1个Button控件。 登录图书管理系统之后,在“图书管理系统”窗口中单击dgvBook控件的某一行中的“借阅”链接,将打开“借阅户籍”对话框(即LendForm.cs窗体)。 实现LendForm.cs窗体的具体步骤如下: (1)LendForm.cs窗体位于LibraryManager目录下,它所在的命名空间为Library Manager,同时还引入了2个命名空间:LibraryManager.Component和LibraryManager.Data。 (2)窗体数据初始化。窗体数据初始化主要实现显示当前书籍的详细信息(如名称、作者、ISBN等)和组及其用户,由LendForm_Load(object sender,EventArgs e)事件、InitUserData(string groupIDString)和InitData(int bookID)方法共同实现。 LendForm_Load(object sender,EventArgs e)事件调用InitData(int bookID)方法初始化dgvBook控件的数据。 InitData(int bookID)方法首先显示指定书籍(由bookID变量指定)的详细信息(如名称、作者、ISBN、出版单位、出版时间、数量、状态、电子文档、封面图片、图书简介、图书分类等),然后显示组及其包含的用户。该方法的具体步骤如下: 判断bookID变量的值是否小于0。如果是,则终止当前方法。,创建LibraryManagerDB数据库的数据上下文的实例db。该实例使用保存在资源文件中的连接字符串LibraryManagerDBConnectionString。 创建“from b in db.Book where b.ID = bookID select b;”查询表达式,并保存为result变量。该查询表达式从Book表中查询被显示的书籍。 如果result变量的结果集合中的对象数量大于0,则获取第一个对象,并保存为book变量。 获取book变量的值,并显示在当前窗体的控件中。 设置cbGroup控件的数据源为Group表,并指定其DisplayMember和ValueMember属性的值分别为Name和ID。 如果cbGroup控件的数据项的数量大于0,则设置第一项为当前选择项,并调用InitUserData(string groupIDString)方法显示该选择项包含的所有用户。 根据cbGroup控件的数据项的数量设置“借阅书籍”按钮的可用性。,(3)按钮的事件。当用户单击窗体中的“借阅书籍”按钮(btnSure控件)时,将触发Click事件btnSure_Click(object sender, EventArgs e)。该事件实现借阅书籍的功能,具体步骤如下: 弹出“借阅书籍询问对话框”对话框。如果用户单击“确定”按钮,将执行以下借阅书籍的操作。如果用户单击“取消”按钮,则取消当前操作。 创建LibraryManagerDB数据库的数据上下文的实例db。该实例使用保存在资源文件中的连接字符串LibraryManagerDBConnectionString。 创建UserBook类的实例ub,并设置该实例BookID、UserID、CreateDate和Status属性的值。 调用InsertOnSubmit()方法将该实例插入到UserBook表中。 创建“from b in db.Book where b.ID = bookID select b;”查询表达式从Book表中查询被借阅的书籍,并使用foreach语句修改该书籍的库存数量和已借数量。 调用db实例的SubmitChanges()方法将上述修改提交到数据库。 最后,如果借阅书籍成功,弹出“恭喜您,借阅书籍成功!”对话框。,25.3 学生和老师模块,学生和老师模块包括登录、主窗体、归还书籍、查看书籍信息、浏览书籍、借阅书籍等功能。学生和老师可以通过主窗体查看所借阅的书籍,并能够归还书籍。浏览书籍窗体可以根据书籍分类浏览各种书籍,并借阅书籍。本节主要介绍这些功能模块的具体实现。,25.3.1 学生或老师登录,学生或老师登录也是由LoginForm.cs窗体实现。学生或老师在登录窗体可以输入用户名和密码,输入正确后,单击“登录”按钮即可登录成功,单击“取消”按钮可以关闭窗体。在此不做详细介绍。,25.3.2 主窗口,学生或老师的主窗体都由UserForm.cs窗体实现。该窗口以列表形式显示学生或老师已借的所有书籍。学生或老师单击“归还书籍”按钮可以归还选择的书籍,单击“浏览书籍”按钮可以打开浏览书籍的窗体。UserForm.cs窗体的标题为“图书管理系统”,该窗体包括1个DataGridView控件、1个Button控件和1个LinkLabel控件。 运行图书管理系统之后,学生或老师登录之后出现的第一个窗口就是UserForm.cs窗体。 实现UserForm.cs窗体的具体步骤如下所示。 (1)UserForm.cs窗体位于LibraryManager目录下,它所在的命名空间为Library Manager,同时还引入了3个命名空间:LibraryManager.Component、LibraryManager.Data和LibraryManager.Admin。 (2)窗体数据初始化。窗体数据初始化主要实现设置dgvBook控件的数据,由UserForm_Load(object sender,EventArgs e)事件和ShowData(int userID)方法共同实现。 cbCategory控件以列表、层次结构方式显示分类。UserForm_Load(object sender,EventArgs e)事件调用ShowData(int userID)方法初始化dgvBook控件的数据。 dgvBook控件显示当前登录用户借阅的所有书籍,它包含以下7个列。,ShowData(int userID)方法初始化dgvBook控件的数据。该方法的具体步骤如下所示。 创建LibraryManagerDB数据库的数据上下文的实例db。该实例使用保存在资源文件中的连接字符串LibraryManagerDBConnectionString。 创建“from b in db.Book join ub in db.UserBook on b.ID equals ub.BookID where ub.UserID = userID ”产生元素类型为UserBookInfo的结果集合。,设置result查询表达式的查询结果作为dgvBook控件的数据源。 设置dgvBook控件的各个列的显示顺序。 设置dgvBook控件的每一个列不能排序。 设置每一行的行标题。 根据dgvBook控件的行数量,设置“归还书籍”控件的可用性。 (3)dgvBook控件的事件。dgvBook控件只包括dgvBook_CellContentClick(object sender, DataGridViewCellEventArgs e)事件。当用户选择dgvBook控件中的“详细信息”列中的每一个单元格内容时,都触发dgvBook_CellContentClick(object sender,DataGridViewCellEventArgs e)事件。具体步骤如下: 判断列的索引是否合法。 如果被选择的单元格属于“详细信息”列(即列的Name属性的值为“cDetails”)时,事件获取当前行的书籍的ID属性的值,并打开BookInfoForm.cs窗体。该窗体可以查看当前行书籍的详细信息。 (4)按钮的事件设计。当用户单击“浏览书籍”链接(llBrowser控件)时,将触发llBrowser_LinkClicked(object sender,LinkLabelLinkClickedEventArgs e)。该事件以对话框形式打开BrowserForm.cs窗体(浏览书籍窗口)。当用户关闭BrowserForm.cs窗体时,该事件调用ShowData(int userID)方法在dgvBook控件中重新显示当前用户已借的所有书籍。 当用户关闭当前窗体时,将触发UserForm_FormClosed(object sender, FormClosedEvent Args e)事件。该事件调用Application类的Exit()方法退出应用程序。,25.3.3 归还书籍,归还书籍功能是通过“归还书籍”按钮的单击事件来实现的。具体步骤如下: (1)弹出“归还书籍询问对话框”对话框。如果用户单击“确定”按钮,将执行以下归还书籍的操作。如果用户单击“取消”按钮,则取消当前操作。 (2)创建LibraryManagerDB数据库的数据上下文的实例db。该实例使用保存在资源文件中的连接字符串LibraryManagerDBConnectionString。 (3)获取被归还书籍(即当前行书籍)的ID值,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论