【问题标题】:Access the Kanban Column (a Team-Specific Field) for a Work Item访问工作项的看板列(团队特定字段)
【发布时间】:2013-08-14 02:54:51
【问题描述】:

有没有办法使用 TFS 2012 API 以编程方式访问 WorkItem 的“看板列”?

使用 Scrum 2.2 模板,每当在 Board 上的 Kanban 列之间拖动工作项时,Bug 或 Product Backlog Item 的历史记录显示“[MyProject\MyTeam] Kanban Column”作为更改的字段,但该字段不是通过 TFS API 专门检索工作项时可访问。

Microsoft.TeamFoundation.Framework.Server.ISubscriber 接口上实现ProcessEvent 方法时,它还会在WorkItemChangedEvent 对象中显示为更改的字段。

解决方法: 一位同事发现了 blogpost 关于创建只读自定义字段以保留看板列的值,利用 WorkItemChangedEvent 捕获最新值。然后可以查询该列。这种方法的一个问题是只能跟踪单个团队的看板列。

更新: 根据这个blogpost,看板列不是一个字段,而是一个“WIT 扩展”。这可能有助于找到答案。

【问题讨论】:

    标签: tfs tfs-sdk kanban


    【解决方案1】:

    我找到了一种在 ISubscriber.ProcessEvent 方法中使用 TFS 2013 API 来读取值的方法:

    var workItemId = 12345;
    var extService = new WorkItemTypeExtensionService();
    var workItemService = new WorkItemService();
    var wit = workItemService.GetWorkItem(requestContext, workItemId);
    foreach (var wef in extService.GetExtensions(requestContext, wit.WorkItemTypeExtensionIds))
    {
        foreach (var field in wef.Fields)
        {
            if (field.LocalName == "Kanban Column" || field.LocalName == "Backlog items Column")
            {
                // Access the new column name
                var columnName = wit.LatestData[field.Field.FieldId];
            }
        }
    }
    

    【讨论】:

    • 在哪个 dll 中可以找到这些类?
    • 这似乎只适用于服务器端。有没有办法从客户端应用程序访问它?
    • 此代码示例可以更大,因为有很多变量无法解析.. :-(
    【解决方案2】:

    如果你准备好深入数据库,你可以挖掘出这些信息。我还不完全了解 TFS 中团队的建模,但首先您需要确定感兴趣的团队将看板状态存储在哪个字段 id 中,如下所示(TFS 2012):


     USE Tfs_DefaultCollection
     SELECT TOP(10)
            MarkerField + 1 as FieldId,* 
     FROM tbl_WorkItemTypeExtensions with(nolock) 
     JOIN tbl_projects on tbl_WorkItemTypeExtensions.ProjectId = tbl_projects.project_id
     WHERE tbl_projects.project_name LIKE '%ProjectName%
    

    然后将下面的 XXXXXXXX 替换为上面发现的 FieldId


     SELECT TOP 1000 
            wid.Id, 
            wia.State, 
            wid.StringValue as Kanban, 
            wia.[Work Item Type], 
            wia.Title, 
            tn.Name as Iteration
     FROM tbl_WorkItemData wid with(nolock)
     JOIN WorkItemsAre wia on wia.ID = wid.Id
     JOIN TreeNodes tn on wia.IterationID = tn.ID
     WHERE FieldId = XXXXXXXX and RevisedDate = '9999-01-01 00:00:00.000'
     ORDER BY Id
    

    【讨论】:

      【解决方案3】:

      我不熟悉 Scrum 2.2 模板,但在 TFS 工作项跟踪方面,CMMI 或 Scrum 模板的工作是相同的。

      试试这样的:

      public string GetKanbanColumn(WorkItem wi)
      {
          if (wi != null)
          {
              return wi["Kanban"].ToString();
          }
          return string.Empty;
      }
      

      取决于列的实际名称,在工作项模板 XML 文件中指定。希望这会有所帮助。

      【讨论】:

      • TFS 2012 支持多个团队,并且看板列在 Scrum 模板中每个团队都是唯一的,因此无法使用下标运算符访问这些列。
      猜你喜欢
      • 2020-10-06
      • 1970-01-01
      • 2021-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-05
      • 2018-09-11
      相关资源
      最近更新 更多