簡體   English   中英

如何抽象樹視圖節點的創建/填充?

[英]how to abstract tree view node creation/ population?

我有以下代碼,我想將全局方法設置為static,以便可以在asp.net Web應用程序上構建幾個樹形視圖。 現在,我每個人都使用下面的代碼構建自己的樹形視圖。 我正在考慮制作一種全局靜態方法來生成諸如此類的節點結構,然后將其分配給我頁面中的樹形視圖……或類似的東西。 我會關心實際解決方案的細節,只要我可以有一個像“ buildTree()”這樣的方法就可以將樹視圖控件綁定到該方法。

艱難?

DataTable dtProjects = new DataTable();
            DataTable dtRelease = new DataTable();

            using (SqlConnection con = Global.GetConnection())
            {
                StringBuilder str = new StringBuilder();
                str.Append("SELECT r.ReleaseId, ");
                str.Append("       r.Name, ");
                str.Append("       rs.EndDate ");
                str.Append("  FROM Release r ");
                str.Append("  LEFT OUTER JOIN ReleaseSchedule rs ");
                str.Append("    ON r.ReleaseId = rs.ReleaseId ");
                str.Append("   AND rs.MilestoneCID = 77");
                str.Append(" WHERE r.CompletionStatusCID NOT IN (34, 35) ");
                str.Append(" ORDER BY r.ReportingPriority, r.Name ");
                SqlDataAdapter da = new SqlDataAdapter(str.ToString(), con);
                da.Fill(dtRelease);

                str = new StringBuilder();
                str.Append("SELECT p.ProjectId, ");
                str.Append("       p.ProjectName, ");
                str.Append("       p.ParentProjectId, ");
                str.Append("       p.ReleaseId ");
                str.Append("  FROM Project p ");
                str.Append(" WHERE p.CompletionStatusCID NOT IN (34, 35) ");
                str.Append("   AND p.ProjectTypeCID <> 92 ");
                str.Append(" ORDER BY p.ProjectName ");

                da = new SqlDataAdapter(str.ToString(), con);
                da.Fill(dtProjects);
            }

            tvProject.Nodes.Clear();
            TreeNode rootNode = new TreeNode("All Projects");
            rootNode.Expanded = true;

            foreach (DataRow drRelease in dtRelease.Rows)
            {
                TreeNode releaseNode = new TreeNode((string)drRelease["Name"]);
                DataRow[] releaseProjects = dtProjects.Select("(ReleaseId = " + drRelease["ReleaseId"] + ") AND (ParentProjectId IS NULL)");

                foreach (DataRow drProject in releaseProjects)
                {
                    TreeNode projectNode = new TreeNode((string)drProject["ProjectName"], drProject["ProjectId"].ToString());
                    projectNode.ToolTip = "This is a project node and is selectable";
                    loadTVNode((int)drProject["ProjectId"], projectNode, dtProjects);
                    if (drRelease["EndDate"] != System.DBNull.Value)
                    {
                        string s = ((DateTime)drRelease["EndDate"]).ToString(Global.CONST_DateFormat);
                        releaseNode.ToolTip = "Release scheduled for deployment on " + s;
                    }
                    else
                        releaseNode.ToolTip = "Release deployment has not been scheduled";

                    releaseNode.ToolTip += ". This node is not selectable";
                    releaseNode.ChildNodes.Add(projectNode);
                }
                rootNode.ChildNodes.Add(releaseNode);
            }

            tvProject.Nodes.Add(rootNode);

我沒有立即得到這個問題,但是我想您正在尋找這樣的東西:

用一個公共方法創建一個名為TreeViewBuilder的類,以從現有的方法返回已填充的TreeView:

public class TreeViewBuilder
{
    public static TreeView BuildTreeView( TreeView tree )
    {
        DataTable projects = GetProjects();
        DataTable releases = GetRealeases();

        return InternalTreeViewBuilder(tree, projects, releases);
    }
}

我的猜測是,您可以在此解決方案中填補空白,例如傳遞所需的參數等等。 您還可以從放置在問題中的代碼中為要調用的樹方法構建代碼。 您的創建例程現在為:

//TreeView something;
TreeViewBuilder.BuildTreeView(something);

更酷的是,如果您使用的是.NET Framework 3.5以上版本,則可以將該方法作為擴展:

public static class TreeViewBuilder
{
    public static TreeView BuildTreeView( this TreeView tree )
    {
        DataTable projects = GetProjects();
        DataTable releases = GetRealeases();

        return InternalTreeViewBuilder(tree, projects, releases);
    }
}

然后,調用您的方法將變得更加簡單:

//TreeView something;
something.BuildTreeView();

完成了! MSDN有一些很棒的擴展方法代碼。

希望我能幫忙!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM