本文章是由機器翻譯。

Team System

自訂工作項目

Brian A.Randell

下載範例程式碼

Team Foundation Server ’s 追蹤系統的工作項目提供數種進階的自訂選項。如果您 ’re 新工作項目自訂和工作項目物件模型,您可以檢閱我先前的文件 (請參閱 msdn.microsoft.com/magazine/cc301186.aspx),以及文件。我 ’ll 本文中討論這個區域是自訂控制項支援。若要啟動,為什麼您要在您工作項目中使用自訂控制項?也,您可能想更好的使用者經驗,您可能想要連結 (例如一個說明桌面應用程式中) 的另一個外部系統的資料,或您可能要以圖表格式呈現現有的工作項目資料。在任何原因自訂控制項可以幫助。

自訂控制項

在 Team System 的 [2005 SP1] 發行 Microsoft 加入自訂控制項的支援,當您使用標準的工作項目轉譯器,在 Visual Studio 或您自己的自訂 Windows 應用程式中。在 2008年版本,Microsoft 會加入支援Team System Web Access的 Web 自訂控制項。您可以撰寫自訂控制項為使用者介面和 API 的工作項目與互動的邏輯的組合。裝載於標準的工作項目轉譯器的自訂控制項是繼承自 System.Windows.Forms.Control 和實作 IWorkItemControl 介面的類別。Team System Web Access,您可以建立類別,繼承自 System.Web.UI.Control 實作 IWorkItemWebControl。

若要快速入門,您需要 Visual Studio 2008 Professional版或更高,Team Foundation Server的存取與 Visual Studio Team System 2008 Team 總管。正如我 ’ve 前一個資料行中所提到,我鼓勵您使用像 Microsoft 所提供的虛擬機器影像的測試環境。內部 Visual Studio、 建立類別庫專案,然後重新命名預設的類別將範本加入等級。此自訂控制項將會用於內建的 「 工作 」 工作項目類型中,內建等級欄位提供下拉式方塊介面。Microsoft 提供的程序指南狀態:「 必要的。順位欄位是一項主觀的重要性分級。如果順位欄位設定為 1,工作是一項必須有的工作,並應該儘速完成。如果順位設定為 2,任務為應該有工作,來完成下列排名 1 的所有任務。如果順位設定為 3,它 ’s 可能具有工作,工作排名 1 和 2 之後完成 」。不過,[等級] 欄位中呈現時使用的開啟文字欄位,允許使用者輸入的隨機資料。使用組合方塊可讓您限制使用者輸入的值。

您要新增數目的組件的參考,您可以撰寫任何程式碼之前。首先,您必須為 System.Windows.Forms 參考。第二個,您需要參考幾個 Team System 組件。若要開始,加入 Microsoft.TeamFoundation.WorkItemTracking.Controls.dll,位於 %程式 Files%\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies 參考。

類別檔案頂端加入下列匯入陳述式:

Imports System.Windows.Forms
Imports Microsoft.TeamFoundation.WorkItemTracking.Controls

因為您 ’re 要取代現有的文字方塊控制項下拉式方塊,您會想等級類別繼承自下拉式方塊。接下來,工作項目產生器來裝載您的控制項,您需要實作 IWorkItemControl 介面。圖 1, 所示介面是由兩個事件、 四種方法和四個屬性所組成。圖 2 提供每個成員和其用途的明細。

[圖 1]IWorkItemControl 介面

Public Interface IWorkItemControl
    Event AfterUpdateDatasource As EventHandler
    Event BeforeUpdateDatasource As EventHandler
    Sub Clear()
    Sub FlushToDatasource()
    Sub InvalidateDatasource()
    Sub SetSite(ByVal serviceProvider As IServiceProvider)
    Property Properties As StringDictionary
    Property [ReadOnly] As Boolean
    Property WorkItemDatasource As Object
    Property WorkItemFieldName As String
End Interface

成員描述

AfterUpdateDatasource會引發這個事件之後您 ’ve 變更工作項目值,。

BeforeUpdateDatasource引發此事件之前您對工作項目值進行任何變更。

清除清除您的顯示項目,任何的資料。

FlushToDatasource儲存至工作項目 ; 控制項中顯示任何資料通常會發生工作項目儲存作業的一部份。

InvalidateDatasource重新載入,並顯示目前的資料,從工作項目。

SetSite如果您要存取服務,Visual Studio ; 內提供 [IServiceProvider 參考其值可以是 null。

[屬性]屬性包包含相關的屬性,從的裝載的工作項目類型 XML 定義特定的欄位。

ReadOnly表示控制項應該僅讀取模式中顯示。

WorkItemDatasource為作用中工作項目執行個體 ; 參考您必須將它轉換成 WorkItem 執行個體。

WorkItemFieldName繫結控制項欄位的名稱。

圖 2 IWorkItemControl 成員

針對每個介面屬性,您必須建立相對應的支援欄位。若要將 [WorkItemDatasource 儲存為強型別參考,您需要將參考加入至 Microsoft.TeamFoundation.WorkItemTracking.Client.dll 組件儲存在 %程式 Files%\Microsoft Visual Studio 9.0\Common7\IDE\PrivateAssemblies。一旦您 ’ve 加入此參考,您也應該匯入 Microsoft.TeamFoundation.WorkItemTracking.Client 命名空間。您 ’ve 連結在其支援的欄位屬性後,您可以實作介面方法。

但是,您之前,您必須先定義 [下拉式方塊] 和 [地址問題的資料項目,是否要輕易地調整值使用。如果是這樣,您應該實作一個機制,例如讓控制項擷取最新的值是 Web 服務。在就另外如果 ’re 要顯示的字串值,您應該考慮當地語系化問題。為使本範例中,但是,我們 ’ll 只新增預設的建構函式的 hardcodes 的值,如下所示。請注意工作項目執行階段支援只有有預設值沒有引數的建構函式中的控制項。

Public Sub New()
  MyBase.New()

  Me.Items.Add("1 - Must Have")
  Me.Items.Add("2 - Should Have")
  Me.Items.Add("3 - Could Have")
End Sub

您也應該提供 Clear 方法的實作。根據預設,工作項目執行階段載入控制項時, 所顯示的值是空白。若要回到此狀態,您要將 [SelectedIndex 屬性設定為-1 清除方法中。您需要實作最後兩個方法與載入繫結的工作項目欄位,與工作項目執行個體的值,然後保存值,如果使用者儲存工作項目。您可以使用 InvalidateDataSource 方法來更新您的控制項 ’s 顯示資料,從目前的工作項目,或清除先前載入的資料。它 ’s 儲存使用中工作項目時,工作項目執行階段會呼叫 FlushToDataSource。圖 3 提供等級的自訂控制項的兩個方法的實作。

圖 3 FlushToDatasource 和 InvalidateDataSource 的實作

Public Sub FlushToDatasource() _
  Implements IWorkItemControl.FlushToDatasource
 
  If SelectedIndex > -1 And workItemDS IsNot Nothing Then
    RaiseEvent BeforeUpdateDatasource(Me, EventArgs.Empty)
    workItemDS.Fields(fieldName).Value = CStr(SelectedIndex + 1)
    RaiseEvent AfterUpdateDatasource(Me, EventArgs.Empty)
  End If
End Sub

Public Sub InvalidateDatasource() _
  Implements IWorkItemControl.InvalidateDatasource
  If workItemDS IsNot Nothing AndAlso _
    Not String.IsNullOrEmpty(workItemDS.Fields(fieldName).Value) Then

    Dim current As Integer = CInt(workItemDS.Fields(fieldName).Value)
    ' Make sure the value returned does not exceed our valid range
    ' If it does, set it to our most important value
    If current > Me.Items.Count Then
      current = 1
    End If
    SelectedIndex = (current - 1)
  Else
    Clear()
  End If
End Sub

FlushToDataSource 檢查使用者是否已選取一個值,並在參照到作用中工作項目仍然有效。如果是這樣,它引發 BeforeUpdateDataSource 事件、 將目前的值寫入至工作項目,並遵循這 AfterUpdateDataSource 呼叫。InvalidateDataSource 會檢查是否有 ’s 作用中工作項目有效的參考。如果所以,它會檢查如果有 ’s 目前儲存在繫結的欄位中一個值,擷取值如果沒有,轉換為整數,因為它 ’s 儲存為字串。它會以確保值 doesn’t 超過支援的範圍控制項的範圍檢查最後,— 在本例 1 到 3。這裡,程式碼只是設定值為 1 如果它 ’s 支援範圍之外。另一個方法中,您可以提供一些使用者介面,以允許使用者選擇支援的值或其他的經驗。最後,如果有 ’s 沒有作用中工作項目,或使用者已選擇,程式碼會呼叫 Clear 方法來重設控制項。圖 4 提供等級的控制項的完整實作。

圖 4 的等級控制]

Imports System.Windows.Forms
Imports Microsoft.TeamFoundation.WorkItemTracking.Controls
Imports Microsoft.TeamFoundation.WorkItemTracking.Client
Imports System.Collections.Specialized

Public Class Rank
  Inherits ComboBox
  Implements IWorkItemControl
  ' Backing fields
  Private fieldName As String
  Private fReadOnly As Boolean
  Private serviceProvider As IServiceProvider
  Private workItemDS As WorkItem
  Private workItemProperties As StringDictionary

  Public Event AfterUpdateDatasource( _
    ByVal sender As Object, ByVal e As System.EventArgs) _
    Implements IWorkItemControl.AfterUpdateDatasource

  Public Event BeforeUpdateDatasource( _
    ByVal sender As Object, ByVal e As System.EventArgs) _
    Implements IWorkItemControl.BeforeUpdateDatasource

  Public Sub New()
    MyBase.New()
 
    Me.Items.Add("1 - Must Have")
    Me.Items.Add("2 - Should Have")
    Me.Items.Add("3 - Could Have")
  End Sub

  Public Sub Clear() Implements IWorkItemControl.Clear
    SelectedIndex = -1
  End Sub

  Public Sub FlushToDatasource() _
    Implements IWorkItemControl.FlushToDatasource

    If SelectedIndex > -1 And workItemDS IsNot Nothing Then
      RaiseEvent BeforeUpdateDatasource(Me, EventArgs.Empty)
      workItemDS.Fields(fieldName).Value = CStr(SelectedIndex + 1)
      RaiseEvent AfterUpdateDatasource(Me, EventArgs.Empty)
    End If
  End Sub

  Public Sub InvalidateDatasource() _
    Implements IWorkItemControl.InvalidateDatasource
    If workItemDS IsNot Nothing AndAlso _
      Not String.IsNullOrEmpty(workItemDS.Fields(fieldName).Value) Then
 
      Dim current As Integer = CInt(workItemDS.Fields(fieldName).Value)
      ' Make sure the value returned does not exceed our valid range
      ' If it does, set it to our most important value
      If current > Me.Items.Count Then
        current = 1
      End If
      SelectedIndex = (current - 1)
    Else
      Clear()
    End If
  End Sub

  Public Property Properties() As StringDictionary _
    Implements IWorkItemControl.Properties
    Get
      Return workItemProperties
    End Get
    Set(ByVal value As System.Collections.Specialized.StringDictionary)
      workItemProperties = value
    End Set
  End Property

  Public Property IsReadOnly() As Boolean _
    Implements IWorkItemControl.ReadOnly
    Get
      Return fReadOnly
    End Get
    Set(ByVal value As Boolean)
      fReadOnly = value
      Enabled = (Not fReadOnly)
    End Set
  End Property

  Public Sub SetSite(ByVal serviceProvider As IServiceProvider) _
    Implements IWorkItemControl.SetSite
    Me.serviceProvider = serviceProvider
  End Sub

  Public Property WorkItemDatasource() As Object _
    Implements IWorkItemControl.WorkItemDatasource
    Get
      Return workItemDS
    End Get
    Set(ByVal value As Object)
      workItemDS = TryCast(value, WorkItem)
    End Set
  End Property

  Public Property WorkItemFieldName() As String _
    Implements IWorkItemControl.WorkItemFieldName
    Get
      Return fieldName
    End Get
    Set(ByVal value As String)
      fieldName = value
    End Set
  End Property
End Class

您可以嘗試控制項之前先您需要採取三個額外的步驟。 首先,您必須提供一個簡單的 XML 組態檔定義之控制項的工作項目執行階段。 第二個,您要部署控制項 ’s 組件和設定檔案 (以及 PDB) 如果您想要偵錯到其中一個支援執行階段的有效位置。 最後,您要更新工作項目,會使用等級的欄位型別定義,並新增正確的資訊來載入控制項。

部署和偵錯

您所建立的每個自訂控制項必須有 WICC 檔案。 您需要建立簡單的 [XML] 檔案像此處,定義主機組件,以及您的控制項類別名稱。

<?xml version="1.0" encoding="utf-8" ?>
<CustomControl xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <Assembly>BrianRandell.MSDNMag.WICC.Winforms.dll</Assembly>
  <FullClassName>BrianRandell.MSDNMag.WICC.Winforms.Rank</FullClassName>
</CustomControl>

一旦您 ’ve 建立這個檔案,您就應該將 WICC 檔案您的 DLL 和它的 PDB,兩個位置的其中一個複製。 如果您希望控制項可以只看見您的帳號,將它複製到 %本機應用程式 Data%\Microsoft\Team Foundation\Work 項目 Tracking\Custom Controls\9.0 中。 若要讓控制項在特定的工作站上的所有使用者可以看到,將檔案複製到 %一般應用程式 Data%\Microsoft\Team Foundation\Work 項目 Tracking\Custom Controls\9.0。 您最有可能 ’ll 要建立 [Microsoft] 資料夾下的資料夾結構。 您可以使用 Environment.SpecialFolder.LocalApplicationData 值或 Environment.SpecialFolder.CommonApplicationData System.Environment.GetFolderPath 來算出您的本機工作站上路徑。 一旦您 ’ve 複製檔案至這些目錄的其中一個,您必須修改工作項目的型別定義 — 在這個範例中,工作工作項目從 MSF Agile 範本 (使用控制項。 (請參閱我的文件在 msdn.microsoft.com/magazine/dd221363.aspx (如需詳細資訊)。

您可以修改表單版面配置資訊的 [等級] 欄位,如下列程式碼所示。 執行階段的工作項目配管傳遞的所有屬性,列為 IWorkItemControl.Properties 屬性透過控制項的欄位 ’s 版面配置定義的一部份。 只您需要做的變更是從預設的 FieldControl 的 Type 屬性變更為 [等級,新建立控制項的名稱。 一旦您 ’ve 進行變更,並匯入到 Team 專案的新工作項目型別定義,您可以嘗試作業。

<Control Type="Rank" FieldName="Microsoft.VSTS.Common.Rank" 
Label="Ran&amp;k:" LabelPosition="Left" 
NumberFormat="WholeNumbers" MaxLength="10"/>

若要偵錯,您要有複製到正確的部署資料夾的最新的位元及匯入到 Team 專案的修改型別定義。然後,您應該修改偵錯設定值為您的專案使用 「 啟動外部程式 」 選項,及它指向 devenv.exe (請參閱的[圖 5])。現在可以設定某些中斷點,並啟動偵錯。


圖 5 選擇 [設定外部程式] 選項。

生產部署

您 ’ve 任何 kinks 破解您的控制項之後,您需要將它部署至工作站每個人將使用受影響的工作項目。您可以這樣幾種方法。您可以建立使用內建的 Visual Studio 範本,安裝程式,或者您也可以建立一個簡單的指令碼執行的部分使用者 ’s 登入指令碼及 xcopy 檔案至適當位置。最後,如果您已經 ’ve 部署 2008 年 10 月發行的 Team Foundation Server 電源工具,您可以使用 [電源] 工具所提供的 [部署] 功能。若要使用此功能,您要檢查您的組件和資料夾 %小組專案 Name%/TeamProjectConfig/CustomControls WICC 檔案。然後,您只需要存取小組成員節點上的 [個人設定] 選項,並選取 「 安裝下載的自訂元件 」] 選項。請注意您 ’re 建議強式名稱組件,如果您使用這項功能。Microsoft 提供的詳細資訊,這項功能在 [進階工具說明檔案。

注意事項

這個時候您 ’ve 看過自訂控制項的優點。現在有一些 caveats。第一個大問題是主機支援。我們 ’ve 建立會在 Visual Studio 2008 或主機在提供的自訂控制項的應用程式中執行的自訂控制項。如果想支援 Visual Studio 2005 您需要建置與 2005年版本 Team 總管的一個版本,並且分別部署組件和 WICC 檔案。Team System Web Access 呢?理論上,如果您只是 Internet Explorer 作為您的網頁瀏覽器,這可以使用,但它 doesn’t] 按鈕。您看到的內容很類似 圖 6 的。


[圖 6]Visual Studio 2005 支援需要額外的步驟

好消息是 2008年發行Team System Web Access的支援它自己的自訂控制項模型。您 ’ll 發現在電腦上的 %程式 Files%\Microsoft Visual Studio 2008 小組系統 Web Access\Sdk 範例文件Team System Web Access的安裝位置。這只有在您 ’re 執行 2008年版本,使用的但是,2005 版本 doesn’t 支援自訂控制項。在就另外第三方廠商產品像 Teamprise doesn’t 任一個。最佳的解決方案是在您的工作項目 ’s 型別定義中定義多個版面配置元素。然後,您需要重複定義) 的每個不受支援或不同的主機。您再 ’ll 要裝飾目標屬性的版面配置項目。Windows,使用 WinForms 值。對於Team System Web Access,使用 [網頁]。Teamprise,使用 Teamprise。請參閱 msdn.microsoft.com/library/aa337635(VS.80).aspx 如需詳細資訊。

使用自訂的版面配置,就後將呈現,問題解決了,但它也 shines 光線更細微的問題。如 Microsoft Excel 和 Microsoft Project 主機 don’t 完全支援自訂控制項。它們是不會受到影響的工作項目類型的版面配置項目所做的調整。因此,doesn’t 支援您的自訂控制項的任何主機會公開未經處理資料透過其標準介面。在 [等級] 欄位的情況下,這表示標準的編輯欄位。每一部主機會強制執行規則來定義工作項目。但是,您在您的自訂控制項中實作自訂邏輯不會。因此,如果您執行向下使用自訂控制項的道路,您必須教育您的使用者在適當的資料的項目上,支援主機外部執行時,並確定您的控制項執行適當的資料驗證。

Team System 2010

即將 2010年發行的 Team System 保證是完整的用戶端和伺服器是。月 2009,在 Microsoft 發行 Beta 1,以便進行檢閱。當我撰寫本專欄,Microsoft 有承諾有時中 autumn 2009 的第二個測試版。雖然仍有進行一些變更,工作項目追蹤功能就會是相當成熟。可說,Microsoft 所提供的最要求的功能是階層式的工作項目。話雖我使用 Beta 1 版本中,所以任何及所有我在這裡討論的項目是現在和最終發行版本之間的變更。

先前發行之 Team Foundation Server 支援概念的連結工作項目。當您工作項目連結至另一個工作項目時,您可以建立雙向關聯性。任何工作項目可以連結至任何其他工作項目。時有用,這項功能 doesn’t 提供父-子關係。在就另外您也可能會想要能夠定義優先順序方面很常見使用 Microsoft Project 管理工作時。幸好,這兩個這些區域會解決在 2010年版本中。若要支援新的連結語意,Microsoft 會建立兩個新工作項目查詢類型:工作項目及直接連線 (連結查詢) 樹狀結構的工作項目 (樹狀結構查詢)。當您建立一個新的工作項目查詢時,您可以選擇其中一種新的類型,或選擇一般清單的工作項目,表示標準的 2010年發行之前的查詢類型。

若要開始、 看一下新的內建的工作項目類型工作項目查詢。為還與先前的版本為目前提供兩個處理程序範本。在這個階段在開發週期中,大部分的工作是會顯示 [MSFT Agile 軟體開發 v5.0 範本。Microsoft 承諾方法為基礎的版本會顯示在 Beta 2 版本中重要的更新。因此,我 ’ll 使用 Agile 範本做為我的參考點。一旦您 ’ve 建立新的 Team 專案並展開 [工作項目] 節點,您 ’ll 找到熟悉的 [查詢] 和 [小組查詢節點。您 ’ll 注意到在 [Team 總管] 視窗中的兩個細微的增強功能。第一次,Microsoft 變更排序順序:小組查詢之前,排序我的查詢。第二個,Microsoft 自訂圖示,用於每個節點。如果您開啟 [小組查詢節點就 ’ll 發現 [預先定義查詢的清單已經大幅變更 (請參閱的圖 7])。中就另外您 ’ll 請注意 Microsoft 已加入新的資料夾 [活頁簿的查詢。這個資料夾包含支援新的 Excel 活頁簿功能的查詢。您 ’re 自由執行的查詢,但您不應該修改它們 ;否則,您可以中斷一或多個活頁簿依存於這些特定的查詢。

TFS 2008TFS 2010 Beta 1

待處理的 Bug待處理的 Bug

所有問題我的錯誤

所有服務需求品質我的工作

所有情節我的測試案例

所有工作我的工作項目

所有工作項目開啟的問題

我的工作項目,所有的小組專案開啟工作

專案檢查清單開啟測試案例

已解決的 Bug開啟使用者新聞

未分級的 Bug開啟工作項目

 P1 和 P2 使用中的錯誤

 已解決的 Bug

 沒有測試案例的使用者本文

圖 7 Team System 2010 預設查詢

您 ’ll 看到新的名稱 Microsoft 對深變更整個的範本。有使用者本文像新工作項目類型 (請參閱的圖 8]) 和我的測試案例。Microsoft 有聆聽社群套用噸的意見反應 (例如使用最常採用詞彙),進行簡單化和改良的報告。以先前,豐富的專案追蹤,而不需要更估計和資源的追蹤與燒錄下圖類似的新圖表的 SQL Server 報告服務,alluded 新 Excel 為主活頁簿。當 Microsoft 移動使其更靠近釋放時,我 ’ll 挖掘進一步到 2010年發行,包括如何升級您自訂的範本和自訂程式碼。


圖 8 的使用者本文預先定義查詢

總結

在工作項目自訂控制項 Team Foundation Server 提供好機制,以增強您的團隊中的工作項目的可用性。雖然這項功能並非完美,Microsoft 仍會繼續讓它更好。中就實際上,我很期待 Team System 2010 發行,我非常明亮的未來如 Team System,請參閱整體,尤其是工作項目追蹤。