C#⼊门学习-----任务管理系统的设计与实现(WindowsForms
和LINGToEn。。。
欢迎⼤家提出意见,⼀起讨论!
编译平台:VS2010 + .Net Framework 3.5
语⾔: C#
3、系统数据库设计
3、1 数据库设计
系统使⽤微软SQL Server或SQL Express进⾏后台数据存储,并且使⽤Entity Framework来创建实体模型。整个系统由以下4个数据表组成。
(1) Category报表: 保存任务分类信息
(2) Resource表: 保存任务资源信息
(3) Task表: 保存任务详细信息
(4) TaskResource表:保存与任务相关联的资源列表。
在VS中直接创建数据库,步骤如下:
(1) 选择“添加”|“新建项”,选择“基于服务的数据库”。如下图:
点击添加,此时数据库被加到Database⽂件夹中。VS会弹出数据源配置向导,允许⽤户先⾏设计数据库模型,再根据模型产⽣数据库表。
在这⾥单击“取消”按钮,⽰例将使⽤根据数据库表来⽣成数据实体模型,因此先使⽤表设计⼯具创建表。
(2) 在解决⽅案资源管理器上双击TaskManager.mdf ⽂件,VS将弹出服务器资源管理器,并展开数据连接,右击表节点。
在弹出的菜单中选择“添加新表”选项,VS将弹出表设计窗⼝。如下:
在列名字段中,输⼊表字段名称,在数据类型下选择类型。
(3) 在创建了表后,可以利⽤数据库关系图创建表之间的主外键关系。
在服务器资源管理器中,展开数据连接,到数据库关系系图节点,右击⿏标,选择“添加新关系图”选项。
在图形化的表视图上,右击要设置主键的字段,从弹出的菜单中选择“设置主键”选项,可以拖动表到要建⽴关系的⽬标表。如下:
服务器资源管理器还提供了视图、存储过程等节点,允许⽤户直接在VS中创建存储过程,不需要在开发机上安装SQLServer 版,增加开发效率。
3、2 使⽤Entity Framework⽣成实体类
hibernate要学多久Microsoft Entity Framework是微软基于ADO.NET技术所发展出来的对象关系映射(O/R Mapping)解决⽅案,早期称为ObjectSpace.
在过去,程序员总是与数据库不可分割,不可避免要使⽤数据库相关的SQL语句。ORM对象关系映射技术因此⽽⽣,NHibernate是.NET 平台下
⽤于实现ORM的热门⼯具,微软公司不⽢落后,推出了ADO.NET Entity Framework框架。
Entity Framework利⽤了抽象化数据结构的⽅式,将每个数据库对象都转成应⽤程序对象(entity),⽽数据字段都转换为属性(property),
关系则转换为结合属性(association),让数据库的E/R模型完全转成对象模型,因此能让程序员⽤最熟悉的编程语⾔来调⽤访问。
在抽象化的结构之下,则是⾼度集成与对应结构的概念层、对应层和储存层,以及⽀持Entity Framework的数据提供者(provider),让数据访问的⼯作得以顺利与
完整进⾏。
(1) 为了将TaskManager数据库中的表转换为实例对象模型,在解决⽅案资源管理器中右击Database⽂件夹,在弹出的菜单中选择“添加”|“新建项”命令,
选择ADO.NET实体数据模型,点添加后进⼊到实体数据模型向导窗⼝。
(2) 在该窗⼝中选择从数据库⽣成模型,单击下⼀步按钮,将进⼊数据连接选择窗⼝。选择当前创建的数据库连接。
(3) 在指定了连接后,进⼊选择数据库对象窗⼝。如下:
这样之后我们就得到了数据库对应的实例代码⽂件XXXX.cs,它的开头有下⾯的说明
//------------------------------------------------------------------------------
// <auto-generated>
// 此代码由⼯具⽣成。
// 运⾏时版本:4.0.30319.1
//
// 对此⽂件的更改可能会导致不正确的⾏为,并且如果
// 重新⽣成代码,这些更改将会丢失。
// </auto-generated>
//------------------------------------------------------------------------------
(4) 在选择完成后,VS进⼊edmx实体数据模型设计窗⼝。在该窗⼝中,为每⼀个表创建⼀个对象,将每个字段添加为属性,并在数据库间
指定的表间关系创建对象关系。如下:
(5) 如果在开发中数据库结构发⽣变更,可以将模型与数据库间保持同步。
在设计器上右击,选择“从数据库更新模型”选项,VS将弹出选择实体模型窗⼝,选择要更新的实体模型后单击“完成”。
4、任务管理功能的实现
4、1 主窗⼝设计
在ToolStrip的项集合编辑器中,将每个按钮的DisplayStyle 指定为Image,如下:
主窗⼝在启动后,会打开任务⾯板窗⼝中,为了重⽤主窗⼝的打开窗⼝代码,创建⼀个名为OpenChildForm()⽅法。
主窗⼝的Shown事件在主窗⼝已经加载,在显⽰时发⽣,在该事件中通过调⽤OpenChildForm()⽅法来实现任务⾯板的显⽰。在private void InitializeComponent()中先指定窗体是⾸次显⽰后调⽤的函数:
this.Shown += new System.EventHandler(this.MainForm_Shown);
//主窗⼝显⽰Shown时的事件处理代码
private void MainForm_Shown(object sender, EventArgs e)
{
OpenTaskForm();//使⽤OpenTaskForm⽅法打开任务窗⼝
}
/// <summary>
/// o打开任务窗⼝辅助⽅法
/// </summary>
private void OpenTaskForm()
{
//判断当前程序中窗⼝是否⼰被关闭
if (_taskForm == null || _taskForm.IsDisposed)
{ //实例化新窗⼝
_taskForm = new TaskForm();
}
//调⽤通⽤的OpenChildForm⽅法打开⼦窗⼝
OpenChildForm(_taskForm);
}
/// <summary>
/// 打开⼦窗⼝的通⽤⽅法代码
/// </summary>
/// <param name="childForm">⼦窗⼝Form实例</param>
private void OpenChildForm(Form childForm)
{
childForm.MdiParent = this;//设置MDI⽗对象
//指定窗⼝的样式为最⼤化
childForm.WindowState = FormWindowState.Maximized;
childForm.Show();//显⽰⼦窗⼝
}
Shown事件处理代码中调⽤了OpenTaskForm() ⽅法,该⽅法判断_tastForm实例是否已释放。
主窗⼝为所有的⼦窗⼝都维护⼀个类级别的变量,如果⽤户重复打开⼀个已经存在的窗⼝,将不会重复多次创建。
4、2 任务管理窗⼝
左侧⼀个DataGridView控件组成;
右侧是⼀个⾃定义的⽤户控件,⽤来实现任务详细信息的显⽰;
底部是⼀排ComboBox控件允许⽤户进⾏选择过滤。
在任务窗⼝显⽰时,Shown事件触发,在事件处理代码中完成了数据从数据库的加载⼯作。
Shown事件代码调⽤了BindDropDowns()⽅法向DropDownList控件中填⼊数据,使⽤LaadTastList()⽅法向DataGridView和TaskViwer控件中填⼊要显⽰的任务数据。
private void TaskForm_Shown(object sender, EventArgs e)
{
BindDropDowns();//绑定到DropDownList控件
LoadTaskList();
}
/// <summary>
/// 向提供选择参数的下拉列表框填⼊数据
/// </summary>
private void BindDropDowns()
{ //填充优先级下拉列表框
Utility.BindTaskPriorityCombo(cmbPriority, true);
//填充任务状态下拉列表框
Utility.BindTaskStatusCombo(cmbStatus, true);
//填充颜⾊分类下拉列表框
Utility.BindTaskColorCategoryCombo(cmbColorCategory, true);
//填充任务标志下拉列表框
Utility.BindTaskFlagCombo(cmbFlag, true);
//从数据表中绑定任务分类到下拉列表框
BindCategoryDropDown();
}
所有Utility类中的BindXXX⽅法都是⽤于将定义在公共单元中的任务参数枚举值与ComboBox控件绑定,
只有BindCatagoryDropDown实现了从数据库中加载任务分类数据的功能。
/// <summary>
/// 绑定优先级枚举值到下拉列表框
/// </summary>
public static void BindTaskPriorityCombo
(ComboBox priorityCombo, bool addEmpty)
{
priorityCombo.DrawMode = DrawMode.OwnerDrawVariable;//设置⾃绘制模式
//DrawItem事件在绘制项时发⽣,通过关联该事件提供⾃定义的绘制⽅式
priorityCombo.DrawItem += new DrawItemEventHandler(priorityCombo_DrawItem);
priorityCombo.Items.Clear();//清空项列表
if (addEmpty)
{ //如果要添加空⽩,则添加⼀个空的字符串
priorityCombo.Items.Add("");
}
//使⽤Enum.GetValues返回枚举值集合
foreach (TaskPriority priority in Enum.GetValues
(typeof(TaskPriority)))
{ //向项中添加枚举值
priorityCombo.Items.Add(priority);
}
}
由于数据表已经被建模为Entity 实体,因此将使⽤实体类来直接绑定到ComboBox控件,如下:
/// <summary>
/// 绑定到任务分类下拉列表框
/// </summary>
private void BindCategoryDropDown()
{ //实例化EDM模型
TaskManagerEntities taskMgrEntity = new TaskManagerEntities();
//使⽤ToList⽅法将ObjectQuery<Category>转换为泛型列表
List<Category> categoryList = taskMgrEntity.Category.ToList();
//为了在ComboBox中插⼊⼀个空⽩列,实例化⼀个新的Category
Category newCategory = new Category();
//将该Category插⼊到列表第1⾏
categoryList.Insert(0, newCategory);
//指定ComboBox的绑定到的显⽰成员与值成员
cmbCategory.DisplayMember = "Name";
cmbCategory.ValueMember = "CategoryID";
//指定其DataSource为返回的List<Category>泛型
cmbCategory.DataSource = categoryList;
}
Entity Framework中的每个实例表现为System.Data.Objects.ObjectQuery<T>泛型数据,⽤来表⽰⼀个可以返回
特定类型的集合或多个对象的查询。
在使⽤ObjectQuery执⾏查询前,必须要实例化ObectContext,这个对象提供了连接和元数据信息,
⼀个对象查询在以下情形下被执⾏:
(1)使⽤循环遍历语句,⽐如foreach枚举集合。
(2)将该值赋给List<T>泛型集合。
(3)显⽰调⽤Execute()⽅法执⾏查询。
在BindCategoryDropDown()⽅法中,
⾸先实例化了TaskManagerEntities对象。该对象由VS⾃动⽣成,派⽣⾃global::System.Data.Objects.ObjectContext类。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论