【问题标题】:How do I get a DataTable of all my TFS Changesets如何获取所有 TFS 变更集的数据表
【发布时间】:2016-06-23 18:07:54
【问题描述】:

我正在尝试使用我的 TFS 项目变更集的详细信息填充数据表。

我想得到:

  • 每一行代表一个单一的变更提交
  • 过滤后仅显示在两个指定日期之间输入的更改提交。

DataTable 设置有以下列:

  • 文件夹路径
  • 文件名
  • 项目名称
  • 用户名
  • datetime_entered
  • 留言

我希望最终得到这样的结果:

我的主要问题是我不知道在哪里可以找到更改提交数据以迭代以填充我的 DataTable。

【问题讨论】:

  • 什么是不工作,你得到什么错误信息?
  • 我的猜测是这个问题可以大大缩短,所以它看起来不那么令人生畏。大多数了解 TFS 的人都不会需要有关您的应用程序如何使用数据的详细信息。只是一个想法 - 如果它有帮助,那很好。

标签: c# .net winforms tfs visual-studio-2015


【解决方案1】:

我想通了

添加对以下内容的引用:

Microsoft.TeamFoundation

Microsoft.TeamFoundation.Client

Microsoft.TeamFoundation.Common

Microsoft.TeamFoundation.WorkItemTracking.Client

Microsoft.TeamFoundation.WorkItemTracking.Common

Form1.cs 代码如下:

using System;
using System.Data;
using System.Linq;
using System.Windows.Forms;
using Microsoft.TeamFoundation.Server;
using Microsoft.TeamFoundation.Client;
using Microsoft.TeamFoundation.WorkItemTracking.Client;
using System.Collections.Generic;
using Microsoft.TeamFoundation.Framework.Common;
using Microsoft.TeamFoundation.VersionControl.Client;

namespace TFSAPItest
{
    public partial class Form1 : Form
    {
        public static List<Changeset> BaseChangesets { get; set; }

        public Form1()
        {
            InitializeComponent();
            
            TxtDateFrom.Text = DateTime.Now.AddDays(-1).ToString("dd/MM/yyyy");

            TxtDateTo.Text = DateTime.Now.ToString("dd/MM/yyyy");
            
        }

        private void BtnRefresh_Click(object sender, EventArgs e)
        {
            DateTime DateFrom = DateTime.Parse(TxtDateFrom.Text);

            DateTime DateTo = DateTime.Parse(TxtDateTo.Text);
            
            DataTable dt = new DataTable();
            dt.Columns.Add("file_path");
            dt.Columns.Add("filename");
            dt.Columns.Add("project");
            dt.Columns.Add("username");
            dt.Columns.Add("datetime_entered");
            dt.Columns.Add("message");

            List<Changeset> FilteredChangesets = new List<Changeset>();

            foreach (Changeset c in BaseChangesets)
            {
                if(c.CreationDate > DateFrom && c.CreationDate < DateTo)
                {
                    FilteredChangesets.Add(c);

                }

            }

            foreach (Changeset c in FilteredChangesets)
            {
                List<Change> Changes = c.Changes.ToList<Change>();
                
                if (Changes != null && Changes.Count > 0)
                {
                    foreach (Change ch in Changes)
                    {
                        if (ch.Item.ItemType == ItemType.File)
                        {
                            DataRow dr = dt.NewRow();

                            string ServerItem = ch.Item.ServerItem.Substring(ch.Item.ServerItem.IndexOf('/') + 1, ch.Item.ServerItem.Length - ch.Item.ServerItem.IndexOf('/') - 1);

                            dr["file_path"] = ServerItem.Substring(0, ServerItem.LastIndexOf('/'));
                            dr["filename"] = ServerItem.Substring(ServerItem.LastIndexOf('/') + 1, ServerItem.Length - ServerItem.LastIndexOf('/') - 1);
                            dr["project"] = ServerItem.Substring(0, ServerItem.IndexOf('/'));
                            dr["username"] = c.Committer;
                            dr["datetime_entered"] = c.CreationDate.ToString("dd/MM/yyyy HH:mm");
                            dr["message"] = c.Comment;

                            dt.Rows.Add(dr);

                        }

                    }

                }

            }
            
            DgvResults.DataSource = dt;
            
        }

        private void BtnGetInformation_Click(object sender, EventArgs e)
        {
            TfsTeamProjectCollection ProjectCollection = new TfsTeamProjectCollection(new Uri("http://example.com:8080/tfs/ProjectCollection"));

            ProjectCollection.Connect(ConnectOptions.None);

            var vcs = ProjectCollection.GetService<VersionControlServer>();

            VersionSpec versionFrom = VersionSpec.ParseSingleSpec("C529", null);

            VersionSpec versionTo = VersionSpec.Latest;

            string serverPath = @"$/";

            List<Changeset> Changesets = vcs.QueryHistory(serverPath,
              VersionSpec.Latest,
              0,
              RecursionType.Full,
              null,
              versionFrom,
              versionTo,
              Int32.MaxValue,
              true,
              false
              ).Cast<Changeset>().ToList<Changeset>();

            BaseChangesets = Changesets;

            if(BaseChangesets != null)
            {
                GrpDateFilter.Enabled = true;

            }

        }

    }

}

有趣的部分在 BtnGetInformation_Click 方法中。

它有点慢,因为它遍历整个 TFS,但它可以工作!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-09-22
    • 2012-01-02
    • 2011-01-22
    • 2016-12-09
    • 1970-01-01
    • 1970-01-01
    • 2011-03-21
    相关资源
    最近更新 更多