获取任务的技术并不太难,和第二篇的获取项目基本相同,不过获取任务将整个数据库的内容都展现出来,有利于你了解整个TaskVision的业务逻辑。
好了,我们从数据库开始。
Priorities(任务优先级表)
| 列名 |
数据类型 |
长度 |
允许空 |
描述 |
| PriorityID |
int |
4 |
|
主键,自动编号 |
| PriorityText |
varchar |
50 |
|
优先级名称 |
表中已有内容:
Statuses(任务状态表)
| 列名 |
数据类型 |
长度 |
允许空 |
描述 |
| StatusID |
int |
4 |
|
主键,自动编号 |
| StatusText |
varchar |
50 |
|
状态文本 |
表中已有内容:
Users(用户表)
| 列名 |
数据类型 |
长度 |
允许空 |
描述 |
| UserID |
int |
4 |
|
主键,自动编号 |
| UserName |
varchar |
16 |
|
用户名称 |
| UserPassword |
varchar |
16 |
|
用户密码 |
| UserFullName |
varchar |
50 |
|
用户的命名 |
| UserEmail |
varchar |
50 |
|
用户邮箱 |
| IsAccountLocked |
bit |
1 |
|
帐号是否锁定,默认值(0) |
| IsAdministrator |
bit |
1 |
|
用户是否具有管理员权限,默认值(0) |
| DateCreated |
datetime |
8 |
|
用户创建时间,默认值(getDate()) |
Tasks(任务表)
| 列名 |
数据类型 |
长度 |
允许空 |
描述 |
| TaskID |
int |
4 |
|
主键,自动编号 |
| ProjectID |
int |
4 |
|
所属项目编号,用于连接Projects表 |
| ModifiedBy |
int |
4 |
|
任务修改者ID,用于连接Users表 |
| AssignedTo |
int |
4 |
|
任务执行者ID,用于连接Users表 |
| TaskSummary |
varchar |
70 |
|
任务简要总结 |
| TaskDescription |
varchar |
500 |
|
任务详细描述 |
| PriorityID |
int |
4 |
|
所属优先级,用于连接Priorities表 |
| StatusID |
int |
4 |
|
所属状态,用于连接Statuses表 |
| Progress |
int |
4 |
|
任务目前完成进度,默认值(0) |
| IsDeleted |
bit |
1 |
|
任务是否删除标记,默认值(0) |
| DateDue |
datetime |
8 |
|
任务预计完成日期 |
| DateModified |
datetime |
8 |
|
记录最后更改日期,默认值(getDate()) |
| DateCreated |
datetime |
8 |
|
记录创建日期,默认值(getDate()) |
来看下关系图会更清楚:
上图展未了TaskVision数据库表间的关系。除了TaskHistory任务历史记录这个表没有给出,因为这一篇还不会用到。
Projects项目表(该表之前已经介绍过了)
好了,现在我们需要显示特定项目的任务。让我们先来写出Sql语句吧。
SELECT Tasks.TaskID, Tasks.ProjectID, Tasks.ModifiedBy, Tasks.AssignedTo,
Tasks.TaskSummary, Tasks.TaskDescription, Tasks.PriorityID,
Tasks.StatusID, Tasks.Progress, Tasks.IsDeleted, Tasks.DateDue,
Tasks.DateModified, Tasks.DateCreated,
Priorities.PriorityText, Statuses.StatusText,
Users.UserFullName As AssignedToText, u.UserFullName As ModifiedByText
FROM Tasks
JOIN Priorities ON Tasks.PriorityID = Priorities.PriorityID
JOIN Users ON Tasks.AssignedTo = Users.UserID
JOIN Users u ON Tasks.ModifiedBy = u.UserID
JOIN Statuses ON Tasks.StatusID = Statuses.StatusID
WHERE Tasks.ProjectID = @ProjectID And Tasks.IsDeleted = 0
将
<xs:element name="DataSetTasks"> 修改为
<xs:element name="DataSetTasks" msdata:IsDataSet="true">
如下图:
从上面的XML代码中我们可以看出,TaskID为唯一约束,并非主键。
我们将TaskID设为主键,将AutoIncrement设为true(自增),将ReadOnly设为true(只读)。
从上面的Select语句可以看出,我们还需要PriorityText,StatusText,AssignedToText,ModifiedByText。我们可以为Tasks添加这四个元素。
最终效果如下图:
XML源码如下:
<?xml version="1.0" encoding="utf-8"?>
<xs:schema id="DataSetTasks"
targetNamespace="http://tempuri.org/DataSetTasks.xsd"
xmlns:mstns="http://tempuri.org/DataSetTasks.xsd"
xmlns="http://tempuri.org/DataSetTasks.xsd"
xmlns:xs="http://www.w3.org/2001/XMLSchema"
xmlns:msdata="urn:schemas-microsoft-com:xml-msdata"
attributeFormDefault="qualified"
elementFormDefault="qualified">
<xs:element name="DataSetTasks" msdata:IsDataSet="true" msdata:Locale="en-US">
<xs:complexType>
<xs:choice minOccurs="0" maxOccurs="unbounded">
<xs:element name="Tasks">
<xs:complexType>
<xs:sequence>
<xs:element name="TaskID" msdata:ReadOnly="true" msdata:AutoIncrement="true" type="xs:int" />
<xs:element name="ProjectID" type="xs:int" />
<xs:element name="ModifiedBy" type="xs:int" />
<xs:element name="AssignedTo" type="xs:int" />
<xs:element name="TaskSummary" type="xs:string" />
<xs:element name="TaskDescription" type="xs:string" />
<xs:element name="PriorityID" type="xs:int" />
<xs:element name="StatusID" type="xs:int" />
<xs:element name="Progress" type="xs:int" />
<xs:element name="IsDeleted" type="xs:boolean" />
<xs:element name="DateDue" type="xs:dateTime" />
<xs:element name="DateModified" type="xs:dateTime" />
<xs:element name="DateCreated" type="xs:dateTime" />
<xs:element name="PriorityText" type="xs:string" />
<xs:element name="StatusText" type="xs:string" />
<xs:element name="AssignedToText" type="xs:string" />
<xs:element name="ModifiedByText" type="xs:string" />
</xs:sequence>
</xs:complexType>
</xs:element>
</xs:choice>
</xs:complexType>
<xs:unique name="DataSetTasksKey1" msdata:PrimaryKey="true">
<xs:selector xpath=".//mstns:Tasks" />
<xs:field xpath="mstns:TaskID" />
</xs:unique>
</xs:element>
</xs:schema>
接着使用xsd.exe生成强类型DataSet:DataSetTasks
刷新一下解决方法,就会看到生成了DataSetTasks.cs文件了。
在Web服务DataService.asmx中添加新的Web方法:GetTasks
using System;
using System.Data;
using System.Data.SqlClient;
using System.Web;
using System.Collections;
using System.Web.Services;
using System.Web.Services.Protocols;

接着在本地应用程序的DataLayer.cs中添加代码GetTasks方法
using System;
using TaskVision.DataWS;

namespace TaskVision
在主窗体中使用:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Text;
using System.Windows.Forms;

namespace TaskVision
}
cbProjects_SelectedIndexChanged为项目下拉列表选中项改变时引发。
if (_controlsLock) return; 你可能会奇怪,这是用来干嘛,很简单,没有程序会出错。自己想想噢。
运行一下程序:
右边是一个DataGridView控件:dgTasks
在主窗体的代码中你可以看到:dgTasks.DataSource = _dataLayer.Tasks.DefaultView;
现在就先将就在用吧,接下来的文章中,我们将来自定义DataGridView控件。
改变选择的项目:
暂时没有小菜之智能客户端的相关任务,所以右边为空。
好了,今天就先到这里了。
提供到该篇为止的完整源码,包括数据库:https://files.cnblogs.com/a-peng/taskvision_5.rar