0

我有一个 TFS 工作项字段,似乎大多数工作项都存在,但有时不存在。

我正在尝试使用 WorkItemCollection 将这些工作项绑定到列表视图中,并且除了我尝试绑定该字段时,一切正常。

该字段本身在查询选择中指定,并且没有错误。但是,在某些工作项上不引发错误的情况下获取该字段的唯一方法是(在 .cs 中)::

          foreach(WorkItem w in queryResults)
          {
            if (w.Fields.Contains("Symptom"))
            {
              w.Fields["Symptom"].Value.ToString();//show
            }
          }

由于这些工作项处于只读模式,我不能只强制写入值等。(除非我返回一个字典,其值与工作项配对,但我认为这不是最好的解决方案......)

我正在尝试做的是在 Listview ItemTemplate 中,如下所示:

                <div class="details">
                    <%# Server.HtmlEncode(Eval("Fields.Contains(\"Symptom\")? Fields[\"Symptom\"].Value : \"\";").ToString())%>
                </div>

但我得到“包含”不是有效的“字段”属性(因为它是一种收集方法) - 我被 eval 卡住了

如何正确评估和显示我的症状字段?

4

2 回答 2

0

如果您使用 TFS 2015 或 VSTS,您可以使用REST API来获取症状字段。API 看起来像:

GET http(s)://{instance}/DefaultCollection/_apis/wit/workitems?ids=xx&fields=Microsoft.VSTS.CMMI.Symptom&api-version=1.0

或使用 .net Api:

using Microsoft.TeamFoundation.WorkItemTracking.Client;
using Microsoft.TeamFoundation.Client;
using System;

namespace TestCaseProject
{
    class Program
    {
        static void Main(string[] args)
        {
            var tfs =
         TfsTeamProjectCollectionFactory.GetTeamProjectCollection(
             new Uri("http://tfsserver:8080/tfs/CollectionName"));
            var service = tfs.GetService<WorkItemStore>();

            var wi = service.GetWorkItem(id);


            foreach (Field field in wi.Fields)
            {
                Console.WriteLine("{0}: {1}", field.Name, field.Value);
            }


        }
    }
}
于 2016-08-31T09:25:33.863 回答
0

使用 OnItemDataBound

页面上似乎没有任何东西直接起作用,所以我放弃了这种方法,并尝试在代码隐藏中解决我的问题,因为我已经能够在这方面对其进行整理。

我从我的页面中删除了我的 sourceObject,而是让代码隐藏以编程方式数据绑定我的列表视图。(这一步不是必须的)

TFSListView.DataSource = SearchHandler.SearchTFS(searchstring);
TFSListView.DataBind();

然后我使用 OnItemDatabound 事件来管理每个被绑定的项目,我检查被绑定的数据项是否存在烦人的症状字段,如果存在则填写适当的控件(所有这些都替换了一个 eval 行,所以我仍然有点恼火,但似乎不可能直接在aspx页面中)

protected void TFSListView_ItemDataBound(object sender, ListViewItemEventArgs e)
{
  ListViewDataItem myitem = (ListViewDataItem)e.Item; 

  if (e.Item.ItemType == ListViewItemType.DataItem) 
  {
    Control divDetails = e.Item.FindControl("divLsvDetails");
    WorkItem myWI = myitem.DataItem as WorkItem;

    if (myWI != null && divDetails != null)
    {          
      if (myWI.Fields.Contains("Symptom"))
      {            
        ((HtmlGenericControl)divDetails).InnerHtml = myWI["Symptom"].ToString();
      }
    }
  }
}
于 2016-08-31T17:30:01.557 回答