获取任务的技术并不太难,和第二篇的获取项目基本相同,不过获取任务将整个数据库的内容都展现出来,有利于你了解整个TaskVision的业务逻辑。

好了,我们从数据库开始。

Priorities(任务优先级表)

列名 数据类型 长度 允许空 描述
PriorityID int 4   主键,自动编号
PriorityText varchar 50   优先级名称

表中已有内容:
小菜之智能客户端(5)演化TaskVision,获取任务 
Statuses(任务状态表)

列名 数据类型 长度 允许空 描述
StatusID int 4   主键,自动编号
StatusText varchar 50   状态文本

表中已有内容:
小菜之智能客户端(5)演化TaskVision,获取任务 
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())

来看下关系图会更清楚:
小菜之智能客户端(5)演化TaskVision,获取任务
上图展未了TaskVision数据库表间的关系。除了TaskHistory任务历史记录这个表没有给出,因为这一篇还不会用到。
Projects项目表(该表之前已经介绍过了)

好了,现在我们需要显示特定项目的任务。让我们先来写出Sql语句吧。
小菜之智能客户端(5)演化TaskVision,获取任务SELECT Tasks.TaskID, Tasks.ProjectID, Tasks.ModifiedBy, Tasks.AssignedTo, 
小菜之智能客户端(5)演化TaskVision,获取任务       Tasks.TaskSummary, Tasks.TaskDescription, Tasks.PriorityID, 
小菜之智能客户端(5)演化TaskVision,获取任务       Tasks.StatusID, Tasks.Progress, Tasks.IsDeleted, Tasks.DateDue, 
小菜之智能客户端(5)演化TaskVision,获取任务       Tasks.DateModified, Tasks.DateCreated, 
小菜之智能客户端(5)演化TaskVision,获取任务       Priorities.PriorityText, Statuses.StatusText, 
小菜之智能客户端(5)演化TaskVision,获取任务       Users.UserFullName 
As AssignedToText, u.UserFullName As ModifiedByText
小菜之智能客户端(5)演化TaskVision,获取任务
FROM Tasks 
小菜之智能客户端(5)演化TaskVision,获取任务
JOIN Priorities ON Tasks.PriorityID = Priorities.PriorityID 
小菜之智能客户端(5)演化TaskVision,获取任务
JOIN Users ON Tasks.AssignedTo = Users.UserID 
小菜之智能客户端(5)演化TaskVision,获取任务
JOIN Users u ON Tasks.ModifiedBy = u.UserID 
小菜之智能客户端(5)演化TaskVision,获取任务
JOIN Statuses ON Tasks.StatusID = Statuses.StatusID
小菜之智能客户端(5)演化TaskVision,获取任务
WHERE Tasks.ProjectID = @ProjectID And Tasks.IsDeleted = 0
不要被这个Sql语句吓到,只是长了点而已,仅此而已。
它把Tasks表的所有内容都取出,然后把关联表的内容取出。PriorityText,StatusText,AssignedToText,ModifiedByText

从上面我们就可以看出,我们需要为Tasks创建的强类型DataSet:DataSetTasks应该具有哪些内容。就是上面的Select内容。

好了,开始创建强类型DataSet:DataSetTasks
添加XML架构:DataSetTasks.xsd
然后把表Tasks拉入,如下图
小菜之智能客户端(5)演化TaskVision,获取任务
将Document修改为DataSetTasks
XML代码如下:
小菜之智能客户端(5)演化TaskVision,获取任务<?xml version="1.0" encoding="utf-8"?>
小菜之智能客户端(5)演化TaskVision,获取任务
<xs:schema id="DataSetTasks"   targetNamespace="http://tempuri.org/DataSetTasks.xsd"   elementFormDefault="qualified"   xmlns="http://tempuri.org/DataSetTasks.xsd"   xmlns:mstns="http://tempuri.org/DataSetTasks.xsd"   xmlns:xs="http://www.w3.org/2001/XMLSchema"   xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
小菜之智能客户端(5)演化TaskVision,获取任务  
<xs:element name="DataSetTasks">
小菜之智能客户端(5)演化TaskVision,获取任务    
<xs:complexType>
小菜之智能客户端(5)演化TaskVision,获取任务      
<xs:choice minOccurs="0" maxOccurs="unbounded">
小菜之智能客户端(5)演化TaskVision,获取任务        
<xs:element name="Tasks">
小菜之智能客户端(5)演化TaskVision,获取任务          
<xs:complexType>
小菜之智能客户端(5)演化TaskVision,获取任务            
<xs:sequence>
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="TaskID" type="xs:int" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="ProjectID" type="xs:int" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="ModifiedBy" type="xs:int" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="AssignedTo" type="xs:int" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="TaskSummary" type="xs:string" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="TaskDescription" type="xs:string" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="PriorityID" type="xs:int" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="StatusID" type="xs:int" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="Progress" type="xs:int" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="IsDeleted" type="xs:boolean" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="DateDue" type="xs:dateTime" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="DateModified" type="xs:dateTime" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="DateCreated" type="xs:dateTime" />
小菜之智能客户端(5)演化TaskVision,获取任务            
</xs:sequence>
小菜之智能客户端(5)演化TaskVision,获取任务          
</xs:complexType>
小菜之智能客户端(5)演化TaskVision,获取任务        
</xs:element>
小菜之智能客户端(5)演化TaskVision,获取任务      
</xs:choice>
小菜之智能客户端(5)演化TaskVision,获取任务    
</xs:complexType>
小菜之智能客户端(5)演化TaskVision,获取任务    
<xs:unique name="DocumentKey1">
小菜之智能客户端(5)演化TaskVision,获取任务      
<xs:selector xpath=".//mstns:Tasks" />
小菜之智能客户端(5)演化TaskVision,获取任务      
<xs:field xpath="mstns:TaskID" />
小菜之智能客户端(5)演化TaskVision,获取任务    
</xs:unique>
小菜之智能客户端(5)演化TaskVision,获取任务  
</xs:element>
小菜之智能客户端(5)演化TaskVision,获取任务
</xs:schema>
<xs:element name="DataSetTasks"> 修改为<xs:element name="DataSetTasks" msdata:IsDataSet="true">
如下图:
小菜之智能客户端(5)演化TaskVision,获取任务 
从上面的XML代码中我们可以看出,TaskID为唯一约束,并非主键。
我们将TaskID设为主键,将AutoIncrement设为true(自增),将ReadOnly设为true(只读)。

从上面的Select语句可以看出,我们还需要PriorityText,StatusText,AssignedToText,ModifiedByText。我们可以为Tasks添加这四个元素。
最终效果如下图:
小菜之智能客户端(5)演化TaskVision,获取任务
XML源码如下:

小菜之智能客户端(5)演化TaskVision,获取任务<?xml version="1.0" encoding="utf-8"?>
小菜之智能客户端(5)演化TaskVision,获取任务
<xs:schema id="DataSetTasks" 
小菜之智能客户端(5)演化TaskVision,获取任务    targetNamespace
="http://tempuri.org/DataSetTasks.xsd" 
小菜之智能客户端(5)演化TaskVision,获取任务    xmlns:mstns
="http://tempuri.org/DataSetTasks.xsd" 
小菜之智能客户端(5)演化TaskVision,获取任务    xmlns
="http://tempuri.org/DataSetTasks.xsd" 
小菜之智能客户端(5)演化TaskVision,获取任务    xmlns:xs
="http://www.w3.org/2001/XMLSchema" 
小菜之智能客户端(5)演化TaskVision,获取任务    xmlns:msdata
="urn:schemas-microsoft-com:xml-msdata" 
小菜之智能客户端(5)演化TaskVision,获取任务    attributeFormDefault
="qualified" 
小菜之智能客户端(5)演化TaskVision,获取任务    elementFormDefault
="qualified">
小菜之智能客户端(5)演化TaskVision,获取任务  
<xs:element name="DataSetTasks" msdata:IsDataSet="true" msdata:Locale="en-US">
小菜之智能客户端(5)演化TaskVision,获取任务    
<xs:complexType>
小菜之智能客户端(5)演化TaskVision,获取任务      
<xs:choice minOccurs="0" maxOccurs="unbounded">
小菜之智能客户端(5)演化TaskVision,获取任务        
<xs:element name="Tasks">
小菜之智能客户端(5)演化TaskVision,获取任务          
<xs:complexType>
小菜之智能客户端(5)演化TaskVision,获取任务            
<xs:sequence>
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="TaskID" msdata:ReadOnly="true" msdata:AutoIncrement="true" type="xs:int" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="ProjectID" type="xs:int" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="ModifiedBy" type="xs:int" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="AssignedTo" type="xs:int" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="TaskSummary" type="xs:string" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="TaskDescription" type="xs:string" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="PriorityID" type="xs:int" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="StatusID" type="xs:int" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="Progress" type="xs:int" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="IsDeleted" type="xs:boolean" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="DateDue" type="xs:dateTime" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="DateModified" type="xs:dateTime" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="DateCreated" type="xs:dateTime" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="PriorityText" type="xs:string" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="StatusText" type="xs:string" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="AssignedToText" type="xs:string" />
小菜之智能客户端(5)演化TaskVision,获取任务              
<xs:element name="ModifiedByText" type="xs:string" />              
小菜之智能客户端(5)演化TaskVision,获取任务            
</xs:sequence>
小菜之智能客户端(5)演化TaskVision,获取任务          
</xs:complexType>
小菜之智能客户端(5)演化TaskVision,获取任务        
</xs:element>
小菜之智能客户端(5)演化TaskVision,获取任务      
</xs:choice>
小菜之智能客户端(5)演化TaskVision,获取任务    
</xs:complexType>
小菜之智能客户端(5)演化TaskVision,获取任务    
<xs:unique name="DataSetTasksKey1" msdata:PrimaryKey="true">
小菜之智能客户端(5)演化TaskVision,获取任务      
<xs:selector xpath=".//mstns:Tasks" />
小菜之智能客户端(5)演化TaskVision,获取任务      
<xs:field xpath="mstns:TaskID" />
小菜之智能客户端(5)演化TaskVision,获取任务    
</xs:unique>
小菜之智能客户端(5)演化TaskVision,获取任务  
</xs:element>
小菜之智能客户端(5)演化TaskVision,获取任务
</xs:schema>

接着使用xsd.exe生成强类型DataSet:DataSetTasks
小菜之智能客户端(5)演化TaskVision,获取任务
刷新一下解决方法,就会看到生成了DataSetTasks.cs文件了。

在Web服务DataService.asmx中添加新的Web方法:GetTasks

小菜之智能客户端(5)演化TaskVision,获取任务using System;
小菜之智能客户端(5)演化TaskVision,获取任务
using System.Data;
小菜之智能客户端(5)演化TaskVision,获取任务
using System.Data.SqlClient;
小菜之智能客户端(5)演化TaskVision,获取任务
using System.Web;
小菜之智能客户端(5)演化TaskVision,获取任务
using System.Collections;
小菜之智能客户端(5)演化TaskVision,获取任务
using System.Web.Services;
小菜之智能客户端(5)演化TaskVision,获取任务
using System.Web.Services.Protocols;
小菜之智能客户端(5)演化TaskVision,获取任务

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

小菜之智能客户端(5)演化TaskVision,获取任务using System;
小菜之智能客户端(5)演化TaskVision,获取任务
using TaskVision.DataWS;
小菜之智能客户端(5)演化TaskVision,获取任务
小菜之智能客户端(5)演化TaskVision,获取任务
namespace TaskVision

在主窗体中使用:

小菜之智能客户端(5)演化TaskVision,获取任务using System;
小菜之智能客户端(5)演化TaskVision,获取任务
using System.Collections.Generic;
小菜之智能客户端(5)演化TaskVision,获取任务
using System.ComponentModel;
小菜之智能客户端(5)演化TaskVision,获取任务
using System.Data;
小菜之智能客户端(5)演化TaskVision,获取任务
using System.Drawing;
小菜之智能客户端(5)演化TaskVision,获取任务
using System.Text;
小菜之智能客户端(5)演化TaskVision,获取任务
using System.Windows.Forms;
小菜之智能客户端(5)演化TaskVision,获取任务
小菜之智能客户端(5)演化TaskVision,获取任务
namespace TaskVision
}

cbProjects_SelectedIndexChanged为项目下拉列表选中项改变时引发。
if (_controlsLock) return; 你可能会奇怪,这是用来干嘛,很简单,没有程序会出错。自己想想噢。
运行一下程序:
小菜之智能客户端(5)演化TaskVision,获取任务
右边是一个DataGridView控件:dgTasks
在主窗体的代码中你可以看到:dgTasks.DataSource = _dataLayer.Tasks.DefaultView;
现在就先将就在用吧,接下来的文章中,我们将来自定义DataGridView控件。

改变选择的项目:
小菜之智能客户端(5)演化TaskVision,获取任务
暂时没有小菜之智能客户端的相关任务,所以右边为空。

好了,今天就先到这里了。

提供到该篇为止的完整源码,包括数据库:https://files.cnblogs.com/a-peng/taskvision_5.rar

相关文章:

  • 2021-12-18
  • 2021-07-09
  • 2021-07-25
  • 2021-09-04
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-04-18
相关资源
相似解决方案