簡體   English   中英

TFS-VS擴展:通過API將工作項添加到待處理的更改中

[英]TFS - VS Extension: Add work item to pending changes via API

我目前正在開發VS擴展/加載項,我需要將工作項與待處理的更改關聯(不觸發簽入)。

經過幾個小時的搜索,我找不到通過API完成此操作的方法。 我發現將工作項與掛起的更改關聯的唯一方法是Workspace.CheckIn(),它也會觸發簽入。

我想念什么嗎? 還是這真的不可能?

我在下面提供了示例代碼,請注意,我還沒有嘗試過此代碼,但是似乎只能通過一些反思,因為在API中沒有實現此目的的公共方法。 使用VS2012 / 13中新的“團隊資源管理器”窗口,您可以理想地擴展“團隊資源管理器”以提供您想要的功能。 有一些在MSDN上擴展它的示例

下面的代碼獲取服務提供者實例。 您可以通過包實例獲取IServiceProvider對象。 獲取后,需要調用私有的AddWorkItemById方法-在此處檢查方法定義。

int id = workItemId;
IPendingChangesExt service = serviceProvider.GetService<IPendingChangesExt>();
FieldInfo field = service.GetType().GetField("m_workItemsSection", BindingFlags.Instance | BindingFlags.NonPublic);
Type fieldType = field.FieldType;
object value = field.GetValue(service);
MethodInfo method = fieldType.GetMethod("AddWorkItemById", BindingFlags.Instance | BindingFlags.NonPublic);
object[] objArray = new object[] { id };
method.Invoke(value, objArray);

對不起,我的回復很晚,非常感謝。 我必須對其進行一些修改才能使其正常工作:

// VersionControlExt is needed 
var dte = Package.GetGlobalService(typeof(DTE)) as DTE;
var dte2 = (DTE2)dte;

var vce = dte2.DTE.GetObject("Microsoft.VisualStudio.TeamFoundation.VersionControl.VersionControlExt")
      as VersionControlExt;

var pendingChangesExtField = vce.PendingChanges.GetType().GetField("m_pendingChangesExt", BindingFlags.Instance | BindingFlags.NonPublic);
var pendingChangesExt = pendingChangesExtField.GetValue(vce.PendingChanges);

// pendingChangesExt is null when the Pending Changes Window isn't opened
if (pendingChangesExt == null)
  return;

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

// Assign new Work Item to Pending Changes
var addMethod = workItemSectionField.FieldType.GetMethod("AddWorkItemById", BindingFlags.Instance | BindingFlags.NonPublic);
    object[] addArray = { id };

addMethod.Invoke(workItemSection, addArray);

如果有人對如何在“待更改項”窗口的“相關工作項”部分實現拖放感興趣,請執行以下操作:

versionControlServer = ServiceProvider.GetService<ITeamFoundationContextManager>().TeamProjectCollection.GetService<VersionControlServer>();

var selectedItems = new[] {1, 2};

var dropData = new WorkItemDropData(versionControlServer.ServerGuid, selectedItems);
var dataObject = new DataObject("Microsoft.TeamFoundation.WorkItemId", dropData);

DragDrop.DoDragDrop(listView, dataObject, DragDropEffects.Move);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM