Как абстрагировать создание дерева / создание узла населения? - PullRequest
0 голосов
/ 11 ноября 2010

У меня есть приведенный ниже код, который я хочу добавить в глобальный метод, установленный как статический, чтобы я мог создать пару представлений дерева в своем веб-приложении asp.net. теперь у меня есть каждое построение своего собственного дерева, используя код ниже. я думал создать глобальный статический метод для генерации структуры узла, такой как эта, а затем просто назначить их древовидному представлению на моих страницах ... или что-то в этом роде. Мне не безразличны детали фактического решения, поскольку у меня может быть один метод для вызова, например, 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);

1 Ответ

0 голосов
/ 11 ноября 2010

Я не сразу понял вопрос, но, думаю, вы ищете что-то вроде этого:

Создайте класс под названием 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 есть отличные коды для методов расширения.

Надеюсь, я смогу помочь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...