4

я раздвоенный проект с ниже кодом:Как связать рабочий элемент как «связать» или «разрешить» в Visual Studio TFS API (VS2015)?

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 }); 

Это добавляет элемент работы по идентификатору к текущим нерешенным изменениям.

Теперь я хочу, чтобы связать рабочие элементы выбора между «Associate» или «Resolve» (ассоциированное и решимостью), в зависимости от того, какую кнопку нажал пользователь на интерфейс плагина, как показано ниже: enter image description here

, если пользователь нажимает «Связать и разрешать», рабочий элемент должен быть связан и помечен как разрешенный при регистрации.

Если пользователь нажимает «Связать только», рабочий элемент должен быть связан только с набором изменений, но не разрешен.

Любая помощь будет приветствоваться

ответ

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 }); 

Я добавил некоторые новые (код? это разные функции, хорошо) ... это второй вызов будет ждать элемента работы на отложенные изменения «Связанные Wo появляется rk Items, и изменит его связь с Resolve to Associate «вручную».

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(); 

Несмотря на эффективность этого кода, я все еще работаю над лучшим решением при запуске второго метода. Значение «значение по умолчанию», предлагаемое для комментариев, не будет работать, потому что разработчик должен иметь возможность связывать/разрешать только при выборе кнопки.

13

Это не свойство WorkItem. Это действие Check-in для рабочего элемента. Подробности вы можете сослаться на эту ссылку 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


Update

Если вы хотите изменения состояния «Решимость» по умолчанию для «ассоциировать», вам нужно

  • изменить этот раздел реестра HKEY_CURRENT_USER\Software\Microsoft\VisualStudio\1x.0\TeamFoundation\SourceControl\Behavior\ResolveAsDefaultCheckinAction to False.

  • Или для VS2015, есть опция Tools> Options> Source Control> Visual Studio Team Foundation> "Resolve связанные элементы работы по регистрации".

enter image description here

Примечание: Оба выше влияет только на клиентскую машину.

В противном случае для всех пользователей вам необходимо изменить определение шаблона рабочего элемента для типов используемых вами элементов работы (ошибка, задача и т. Д.). Подробные шаги вы можете сослаться на этот вопрос How to disable auto done status for task in checkin

+0

Это правильно, это не о предмете работы, но его связь с текущей ревизией. .. Я просто не знаю, как коснуться этой ассоциации, где она находится и как изменить ее содержимое. –

+0

Вы имели в виду, что хотите реализовать drag & drop для раздела Связанные рабочие элементы окна ожидающих изменений? Взгляните на этот вопрос: http://stackoverflow.com/questions/25331871/tfs-vs-extension-add- work-item-to-pending-changes-via-api, а также эта ссылка https://social.msdn.microsoft.com/Forums/vstudio/en-US/72fa2e9e-5cf0-4243-b51d-77d09cc5a732/c-programmatically -checking-in-code-changes-with-tfs-api-while-associating-the-changeset-to-work? forum = tfsworkitemtracking –

+0

Нет @ patrick-msft, я видел эти ссылки, и они потрясающие, на самом деле , Я многому научился у них, но вопрос не в этом. Мне нужно, связав рабочий элемент, пометить состояние ассоциации «Ассоциировать» вместо «Разрешить» ... В некоторых случаях мой плагин будет ассоциироваться как «разрешить», а в другом - «ассоциировать», я хочу знать как. –

2

Существует только один тип ссылки между рабочим элементом и набором изменений, и информация о ссылке сохраняется в рабочем элементе. Разница между «Associate» и «Resolve» в Visual Studio заключается в том, что «Associate» связывает только рабочий элемент с набором изменений, а «Resolve» изменит статус рабочего элемента на «Resolved» после связывания рабочего элемента с набором изменений.

Если вы разрабатываете свой собственный плагин, вам необходимо написать код для достижения этих функций вручную.

Следующий код показывает, как связать рабочий элемент с ревизией:

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();  
     } 
    } 
} 
+0

Eddie, очень приятно ... этот код связывает работу с существующим набором изменений, ранее зарегистрированным. В моем случае я настраиваю фиксацию. Мой плагин, как показывает изображение, работает с ожидающими изменениями, и он должен отмечать элементы, которые должны быть разрешены (или нет), до того, как будет произведена регистрация. Кстати, спасибо за ваш вклад. –

+0

@ EduardoEliasSaléh Как я уже упоминал в ответе, вам нужно написать код, чтобы обновить состояние рабочего элемента. Таким образом, вы можете установить код для этого до или после регистрации. Тем не менее, я рекомендую вам обновить состояние рабочего элемента после проверки, потому что если вы измените статус для разрешения перед регистрацией, ожидающие изменения будут только на вашем локальном компьютере, но рабочий элемент на сервере будет обновлен. Это не имеет смысла. Общий поток для этого: проверка ожидающего изменения, а затем привязка рабочего элемента к набору изменений и обновление его состояния, если это необходимо. –

Смежные вопросы