ASP.NET TreeView, выберите NodeTemplate при привязке данных, аналогично TemplateSelector в WPF? - PullRequest
1 голос
/ 15 января 2011

Сценарий использования,

У меня есть элементы с иерархической категоризацией, и я хотел бы представить их в виде дерева.TreeView будет заполняться по требованию и содержит как категории, так и элементы, я хотел бы иметь разные шаблоны для категорий и элементов.Это не проблема, если бы элементы были статичными, я мог бы легко перечислить их в разметке aspx и указать шаблон для каждого узла, но при заполнении по запросу я понятия не имею, как это сделать.Я не против решения, предполагающего использование Telerik TreeView или DevExpress Treeview.

Спасибо заранее.

1 Ответ

1 голос
/ 16 января 2011

Хорошо, один день и без комментариев :), я сделал это с помощью RadTreeView, RadTreeNode поддерживает пользовательские атрибуты, я добавил пользовательский атрибут, чтобы различать категорию и элемент, и в NodeTemplate я использовал элемент управления MultiView, который выбираетПросмотр для отображения путем проверки пользовательского атрибута узла.

Вот некоторые части кода,

<telerik:RadTreeView ID="rtvQueries" runat="server" OnNodeExpand="rtvQueries_NodeExpand"
        Skin="Black" OnClientNodeClicking="CheckNodeType" OnNodeClick="rtvQueries_NodeClick">
        <NodeTemplate>
            <asp:HiddenField ID="hfId" runat="server" Value='<%# Container.Value %>' />
            <asp:MultiView ID="mvAll" runat="server" ActiveViewIndex='<%# Container.Attributes["ItemType"] == "C"? 0 : 1 %>'>
                <asp:View ID="vwCategory" runat="server">
                    <asp:Label ID="lblCategory" runat="server" Text='<%# Container.Text %>' />
                </asp:View>
                <asp:View ID="vwQuery" runat="server">
                    <div style="float: left">
                        <asp:Label ID="lblQuery" runat="server" Text='<%# Container.Text %>' />
                    </div>
                    <div style="float: left; margin-left: 20px; overflow: hidden; width: 200px;">
                        <asp:Label ID="lblCommandText" runat="server" Text='<%# Container.Attributes["CommandText"] %>' />
                    </div>
                </asp:View>
            </asp:MultiView>
        </NodeTemplate>
    </telerik:RadTreeView>

Код для NodeExpand,

protected void rtvQueries_NodeExpand(object sender, RadTreeNodeEventArgs e)
        {
            Guid categoryId = new Guid(e.Node.Value);
            List<Category> cats = DBHelper.GetQueryCategories(categoryId);
            cats.ForEach(c =>
            {
                RadTreeNode n = new RadTreeNode(c.Name, c.Id.ToString());
                n.ExpandMode = TreeNodeExpandMode.ServerSideCallBack;
                n.Attributes["ItemType"] = "C";
                e.Node.Nodes.Add(n);
                n.DataBind();
            });

            List<RightBI.Query> queries = DBHelper.GetQueriesByCategoryId(categoryId);
            queries.ForEach(q =>
            {
                RadTreeNode n = new RadTreeNode(q.Name, q.Id.ToString());
                n.Attributes["ItemType"] = "Q";
                n.Attributes["CommandText"] = q.CommandText;
                e.Node.Nodes.Add(n);
                n.DataBind();
            });
        }

Единственная проблема в этом решении - я должен позвонитьПривязка данных к каждому узлу после добавления его в TreeView для оценки выражений привязки.

Я все еще хотел бы видеть другие решения и комментарии к этому решению или лучшие идеи.

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