Now, say you want to link two Work Items, the method will looks like:
public void LinkWorkItems(WorkItem parent, WorkItem son)
RelatedLink rl = new RelatedLink(son.Id);
rl.Comment = "
son.Fields["ParentWI"].Value = parent.Id;
I put a specific comment in the link to mark it as a hierarchy kind of link.
Take care to the last line, you may wonder why I do a SyncToLatest(), the reason is quite simple:
Work Item links are bi-directionals. Once you link a Work Item A to a Work Item B, the opposite link is created automatically when you save A.
Then you better do a SyncToLatest() to get the other Work Item up to date.
For our hierarchy evaluation, it might be a problem because you don’t know if the links you’ll evaluate are for children or the parent.
But there’s a simple way to evaluate if a given link is to a child: just get the ParentWI of that child and compare it with the current Work Item ID.
Here’s a snippet of a method that get all the children of a given Work Item:
public IEnumerable WIGetChildren(WorkItem wi)
ArrayList array = new ArrayList();
// We evaluate all the links for this Work Item
foreach (Link link in wi.Links)
if (link.Comment == "
// Get the linked Work Item
RelatedLink rl = link as RelatedLink;
if (rl == null)
// It’s another kind of link, go to the next one
// Get the corresponding Work Item
// (it’s supposed to be the child)
WorkItem linkedwi = GetWorkItem(rl.RelatedWorkItemId);
// Check if the ParentWI of the child is this Work Item
// If it’s not the case, it’s a child to parent relation
if (wi.Id != (int)linkedwi.Fields["ParentWI"].Value)
// It’s a child, we add it
That’s it, you have everything you need to implement hierarchy in your Work Items!