TFS插件 - 如果未满足某些逻辑限制,则防止工作项保存

时间:2015-12-31 09:22:04

标签: tfs tfs2013 tfs-sdk tfs-workitem

我们正在尝试计算TFS服务器端插件中的参数。 我试图限制用户将PBI移动到Committed状态,除非他们的所有子任务在“剩余工作”字段下都有价值。

这个基本逻辑有效,我可以浏览子项并获取所有值是否存在。 我无法理解的内容\完成是如何防止保存操作,以防任务的工作空值。

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;

但这似乎没有诀窍,我错过了什么?

1 个答案:

答案 0 :(得分: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的值为null,则为了防止工作项保存,添加另一个字段field2,当field1的值为null时将填充该字段。当filed1的值为null时,filed2的值无效,这将阻止保存工作项。

要实现以下任务:当PBI工作项的状态更改为“已提交”时,您需要查找子任务工作项是否在“剩余工作”字段下具有值,然后禁用状态更改。为此,您需要捕获状态下拉列表中的 onChange 事件:

1.添加方法 AddEventHandler(),将事件添加到工作项。

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

2.在 WorkItemDatasource 属性

中调用此方法
object IWorkItemControl.WorkItemDatasource
        {
            get
            {
                return workItem;
            }
            set
            {
                workItem = (WorkItem)value;
                AddEventHandler();
            }
        }

3.现在在 workItem_FieldChanged 方法中执行所需的功能。

根据您的要求,您需要确定更改的字段是否为州,以及是否设置为“已提交”。这可以通过检查事件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