访问工作项的看板列(特定于团队的字段)

时间:2013-08-12 17:26:28

标签: tfs tfs2012 tfs-sdk kanban

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

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

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

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

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

3 个答案:

答案 0 :(得分:6)

我在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];
        }
    }
}

答案 1 :(得分:1)

如果您准备深入了解数据库,可以挖掘出这些信息。我还没有完全理解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

答案 2 :(得分:0)

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

尝试这样的事情:

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

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