【问题标题】:how to abstract tree view node creation/ population?如何抽象树视图节点创建/人口?
【发布时间】:2010-11-11 14:42:25
【问题描述】:

我有下面的代码,我想将全局方法设置为静态,这样我就可以在我的 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);

【问题讨论】:

    标签: c# asp.net treeview


    【解决方案1】:

    我没有马上得到这个问题,但我猜你正在寻找这样的东西:

    创建一个名为 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);
    

    更酷的是,如果您使用 3.5 以上的 .NET 框架,您可以将该方法作为扩展:

    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 有一些很棒的扩展方法代码。

    希望我能帮上忙!

    【讨论】:

    • 问:我的页面上的树视图将有一个代码,将使用此构建器方法,语法如下:MyTree.BuildTreeView(); ??
    猜你喜欢
    • 2022-11-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-20
    • 1970-01-01
    • 2021-12-05
    • 1970-01-01
    • 1970-01-01
    • 2016-04-03
    相关资源
    最近更新 更多