Я публикую этот ответ, чтобы, возможно, помочь кому-то его искать.
DependencyCollection
- это плоский список, поэтому вы должны использовать DependencyWalker
, чтобы иметь древовидную структуру.
Использовать FirstChildи NextSibling для обхода дерева.
Это мой пример кода:
private void button2_Click(object sender, EventArgs e)
{
String srvName = "xxxxxxxxxxxxx";
String dbName = "yyyyy";
Server srv = new Server(new ServerConnection() { ServerInstance = srvName });
Database db = srv.Databases[dbName];
DependencyWalker dependencyWalker = new DependencyWalker(srv);
DependencyTree dependencyTree = dependencyWalker.DiscoverDependencies(
new Urn[] { db.StoredProcedures["test", "dbo"].Urn }, DependencyType.Parents);
var dep = new DependencyPrinter(dependencyTree);
treeView1.Nodes.Clear();
dep.PrintDependency2(treeView1);
treeView1.ExpandAll();
}
И код использует этот класс
class DependencyPrinter
{
private DependencyTree _dependencyTree;
public DependencyPrinter(DependencyTree dependencyTree)
{
_dependencyTree = dependencyTree;
}
public void PrintDependency2(TreeView treeView)
{
var n = treeView.Nodes.Add("");
AddToTreeNode(n, _dependencyTree.FirstChild);
}
private void AddToTreeNode(TreeNode treeNode, DependencyTreeNode node)
{
treeNode.Text = String.Format("({0}).{1}.{2}.{3}"
, node.Urn.Type
, node.Urn.XPathExpression.GetAttribute("Name", "Database")
, node.Urn.XPathExpression.GetAttribute("Schema", node.Urn.Type)
, node.Urn.XPathExpression.GetAttribute("Name", node.Urn.Type));
if (node.FirstChild != null)
{
var n = treeNode.Nodes.Add("");
AddToTreeNode(n, node.FirstChild);
}
if (node.NextSibling != null)
{
var n = treeNode.Parent.Nodes.Add("");
AddToTreeNode(n, node.NextSibling);
}
}
}