2015-12-31 4 views
0

Мы пытаемся рассчитать параметры в плагине сервера TFS. Я пытаюсь запретить пользователям перемещать PBI в состояние Committed, если все их дочерние задачи не имеют значения в поле «оставшаяся работа».Плагин TFS - предотвращение экономии рабочего элемента, если определенные логические ограничения не выполняются

Эта основная логика работает, я могу пройти через дочерние элементы и получить все значения независимо от того, существует или нет. То, что я не понимаю \ Accomplish, - это то, как предотвратить действие «Сохранить» в случае, когда задание задачи имеет значение null.

if (taskswithoutrw.Count() != 0) 
{ 
    permitted = false; 
    TeamFoundationApplicationCore.Log("changedpermitted to false", 0, EventLogEntryType.Information); 
    throw new Exception("Some tasks does not contain \"Remaining Work\" value"); 
} 
else 
{ 
    var tasks = childs.Where(x => TFStringComparer.WorkItemTypeName.Equals(x.Type.Name, Task)); 
    double workSum = 0; 

    foreach (var task in tasks) 
    { 
     workSum += Convert.ToDouble(task.Fields["Remaining Work"].Value)/6; 
     TeamFoundationApplicationCore.Log("Remaining Work sum: " + workSum.ToString(), 0, EventLogEntryType.Information); 
    } 
    wi.Fields["Story Points"].Value = workSum.ToString(); 
    wi.Save(); 
} 

если исключение установки EventNotificationStatus в ActionDenied

catch (Exception ex) 
    { 
      // Log error (Should be logged to the windows event log by default) 
      TeamFoundationApplicationCore.LogException(requestContext, "Exception occurd in ", ex); 
      TeamFoundationApplicationCore.Log("outercatch", 0, EventLogEntryType.Information); 
      statusCode = -1; 
      return EventNotificationStatus.ActionDenied; 
    } 

Method must return this value 
return EventNotificationStatus.ActionPermitted; 

им Но это не кажется, сделать трюк, я упускаю что-то?

ответ

0

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

<FieldDefinition name="Effort" refname="Microsoft.VSTS.Scheduling.Effort" type="Double" reportable="measure"> 
    <REQUIRED /> 
    <HELPTEXT>The estimated effort to implemented the backlog item</HELPTEXT> 
</FieldDefinition> 

Другой способ, чтобы предотвратить сохранение рабочего элемента, если значение FIELD1 является нулевым, добавить еще одно поле поле2 который будет заселен, если значение FIELD1 является нулевым. Когда значение filed1 равно null, значение filed2 недопустимо, что предотвратит сохранение рабочего элемента.

Чтобы выполнить задачу, когда состояние рабочего элемента PBI изменилось на Committed, вам нужно определить, есть ли дочерние объекты задачи Task в поле «оставшаяся работа», а затем отключить изменение состояния. Для этого вам нужно захватить событие OnChange в раскрытом состоянии:

1.Add по методу AddEventHandler() который добавляет событие для работы пункта.

private void AddEventHandler() 
     { 
       workItem.FieldChanged += new WorkItemFieldChangeEventHandler (this.workItem_FieldChanged); 
     } 

2.Call этот метод в WorkItemDatasource собственности

object IWorkItemControl.WorkItemDatasource 
     { 
      get 
      { 
       return workItem; 
      } 
      set 
      { 
       workItem = (WorkItem)value; 
       AddEventHandler(); 
      } 
     } 

3.Now выполнить требуемые функции в workItem_FieldChanged метод.

В соответствии с вашим требованием вам необходимо определить, находится ли измененное поле в состоянии, и если оно установлено в Committed. Это может быть достигнуто путем проверки событий args, как показано ниже.

(e.Field.Name == "State" && e.Field.Value.ToString() == "Committed") 

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

Вы можете проверить этот блог для более подробной информации, которая должна помочь вам: http://www.codeproject.com/Articles/730928/Close-a-Work-Item-only-if-Child-Work-items-are-c

+0

, если я не ошибаюсь, по вашему объяснению + ссылке, вы говорите только на inteface изнутри визуально студии – user1432893