如何在Visual Studio TFS API(VS2015)中将工作项关联为“关联”或“解析”?

时间:2016-03-08 17:58:16

标签: visual-studio visual-studio-2012 tfs visual-studio-2015 tfs-sdk

我用下面的代码分叉了一个项目:

var pc = ParentSection.GetService<IPendingChangesExt>();

var model = pc.GetType().GetField("m_workItemsSection", BindingFlags.NonPublic | BindingFlags.Instance);
var t = model.FieldType;
var mm = model.GetValue(pc);

var m = t.GetMethod("AddWorkItemById", BindingFlags.NonPublic | BindingFlags.Instance);

m.Invoke(mm, new object[] { selectedWorkItemId });

将工作项的ID添加到当前挂起的更改中。

现在,我想链接在“Associate”或“Resolve”(关联和解析)之间选择的工作项,具体取决于用户点击插件界面的按钮,如下所示: enter image description here

如果用户点击“关联并解决”,则工作项应关联并在办理登机手续时标记为已解决。

如果用户点击“仅关联”,则工作项必须仅链接到变更集,但不会解决。

欢迎任何帮助

3 个答案:

答案 0 :(得分:25)

这不是WorkItem的属性。这是工作项的签到操作。详细信息,请参阅此链接Changing the Default CheckIn Option to Associate in TFS 2012

您可能需要使用CheckinWorkItemAction枚举。来自MSDN的更多详细信息。

关于TFS - VS Extension: Add work item to pending changes via API的类似问题,也请查看此链接:C# Programmatically Checking in code changes with TFS API while associating the changeset to a Work Item

更新

如果您想将默认状态'resolve'更改为'关联',则需要

  • 更改设置注册表项 HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\1x.0\TeamFoundation\SourceControl\Behavior\ResolveAsDefaultCheckinAction to False.

  • 或者对于VS2015,有一个选项工具&gt;选项&gt;源控制&gt; Visual Studio Team Foundation&gt; “解决相关的工作项目 签入”。

enter image description here

注意:以上两者仅影响您的客户端计算机。

否则,对于所有用户,您需要编辑正在使用的工作项类型的工作项模板定义(错误,任务等)。您可以参考此问题的详细步骤How to disable auto done status for task in checkin

答案 1 :(得分:2)

工作项和变更集之间只有一种链接类型,链接信息存储在工作项中。 Visual Studio中“Associate”和“Resolve”之间的区别在于“Associate”仅将工作项链接到changeset,而“Resolve”会在将工作项链接到changeset后将工作项的状态更改为“已解决”。 / p>

如果您正在开发自己的插件,则需要编写代码以手动实现这些功能。

以下代码显示了如何将工作项链接到变更集:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.VersionControl.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;

namespace APPI
{
    class Program
    {
        static void Main(string[] args)
        {
            string url = "http://xxx.xxx.xxx.xxx:8080/tfs/DefaultCollection";
            TfsTeamProjectCollection ttpc = new TfsTeamProjectCollection(new Uri(url));
            WorkItemStore wis = ttpc.GetService<WorkItemStore>();
            VersionControlServer vcs = ttpc.GetService<VersionControlServer>();
            int wid = 82;
            int cid = 332;
            WorkItem wi = wis.GetWorkItem(wid);
            Changeset cs = vcs.GetChangeset(cid);
            ExternalLink el = new ExternalLink(wis.RegisteredLinkTypes["Fixed in Changeset"], cs.ArtifactUri.AbsoluteUri);
            wi.Links.Add(el);
            wi.Save();     
        }
    }
}

答案 2 :(得分:1)

看,我已经完成了,但我知道这是错的:

使用问题代码包含工作项:

IPendingChangesExt pendingChangesExt = ParentSection.GetService<IPendingChangesExt>();

var workItemSection = pendingChangesExt.GetType().GetField("m_workItemsSection", BindingFlags.NonPublic | BindingFlags.Instance);

var modelType = workItemSection.FieldType;
var model = workItemSection.GetValue(pendingChangesExt);

var m = modelType.GetMethod("AddWorkItemById", BindingFlags.NonPublic | BindingFlags.Instance);                

m.Invoke(model, new object[] { selectedWorkItemId });

我添加了一些新代码(那些是不同的功能,好吗?)...第二次调用将等待工作项显示在Pending Changes'相关工作项'部分,并将从Resolve更改其关联关联'手动'。

IPendingChangesExt pendingChangesExt = ParentSection.GetService<IPendingChangesExt>();

var model = pendingChangesExt
                     .GetType()
                     .GetField("m_workItemsSection", BindingFlags.NonPublic | BindingFlags.Instance);

var modelType = model.FieldType;
var workItemSection = model.GetValue(pendingChangesExt);

var selectedWil = workItemSection
                              .GetType()
                              .GetProperty("SelectedWorkItems")
                              .GetValue(workItemSection) as ObservableCollection<WorkItemValueProvider>;

var availablWil = workItemSection
                              .GetType()
                              .GetProperty("WorkItemsListProvider")
                              .GetValue(workItemSection) as WorkItemsListProvider;

// Waiting for section to be ready to start association
while (!availablWil.WorkItems.Where(x => x.Id == selectedWorkItemId).Any())
{                    
    await System.Threading.Tasks.Task.Delay(25);
}

selectedWil.Clear();
selectedWil.Add(availablWil.WorkItems.Where(x => x.Id == selectedWorkItemId).First());

EnvDTE80.DTE2 dte2 = Package.GetGlobalService(typeof(DTE)) as DTE2;
dte2.ExecuteCommand("TeamFoundationContextMenus.WorkItemActionLink.TfsContextPendingChangesPageWorkItemActionLinkAssociate");

selectedWil.Clear();

尽管此代码有效,但我仍在努力寻找运行第二种方法的更好解决方案。注释中建议的“默认值”将不起作用,因为开发人员应该能够关联/解决选择按钮的问题。