none
ASP.NET treeview сохранение состояния RRS feed

  • Вопрос

  • Доброго дня, подскажите, пожалуйста. Как сохранить состояние развернутых ветвей Treeview(загружается из ) без отправки на сервер EnableClientScript установить в "True" с "False" сработает, но происходит отправка.

    Заранее благодарю.

            <asp:TreeView ID="TreeView1" DataSourceID="XmlDataSource1" runat="server" CssClass="TreeView1"
                ExpandDepth="0" ViewStateMode="Enabled" EnableClientScript="False">
                <HoverNodeStyle Font-Bold="True" Font-Italic="False" Font-Size="Medium" />
                <LeafNodeStyle ImageUrl="~/Images/images/page_white_text.ico" />
                <RootNodeStyle Font-Bold="True" />
                <DataBindings>
                    <asp:TreeNodeBinding DataMember="section" TextField="title" 
                        SelectAction="Expand" />
                    <asp:TreeNodeBinding DataMember="subsection" TextField="title" NavigateUrlField="url" />
                </DataBindings>
            </asp:TreeView>
            <asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/TestFolder/treeview0.xml"
                XPath="catalog/section" ViewStateMode="Enabled"></asp:XmlDataSource>

    • Перемещено YatajgaEditor 9 ноября 2013 г. 7:25
    9 ноября 2013 г. 7:10

Ответы

  • Без обратной передачи не получится просто так, так как это серверный элемент и рендерится там же. Если нужно отключить обратную отправку, то придётся работать с деревом с помощью JS, что не очень просто с учётом того, что он генерирует HTML таблицу, а не список (ul). Если нужен максимально гибкий вариант, то придётся отказаться от этого контрола и использовать более легковесные варианты.


    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа monteloro 9 ноября 2013 г. 7:32
    9 ноября 2013 г. 7:25
    Модератор
  • Придётся делать вручную. Это сложный контрол и всё реализовано за вас, поэтому если нет весомых причин не использовать обратную отправку, то лучше оставьте всё как есть. Вариант который предложил я максимально гибкий, но у него своя цена – придётся писать много кода вручную.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа monteloro 9 ноября 2013 г. 7:56
    9 ноября 2013 г. 7:52
    Модератор
  • Если вы о том, что  контрол у вас на одной странице, а потом вы его покидаете и возвращаетесь туда же, после посещения другой страницы, то стандартного механизма нет. Придётся вам сохранять информацию об открытых узлах где-нибудь (например в состоянии сеанса), а после, при повторном запросе этой страницы и после привязки данных к контролу, перебрать нужные узлы в коде и изменить их состояние.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа monteloro 9 ноября 2013 г. 8:21
    9 ноября 2013 г. 8:20
    Модератор
  • Чудес таких как правило не бывает. На то они и общие контролы. Более специфические задачи приходится решать самому. Просто можете покапаться в сети, многие сталкиваются с подобными проблемами часто, и иногда выкладывают их в сеть. Правда не думаю, что это тот случай, но всё же, попробовать стоит.

    Сделаем содержимое сообщества лучше, вместе!

    • Изменено YatajgaEditor 9 ноября 2013 г. 8:26
    • Помечено в качестве ответа monteloro 9 ноября 2013 г. 8:27
    9 ноября 2013 г. 8:25
    Модератор

Все ответы

  • Без обратной передачи не получится просто так, так как это серверный элемент и рендерится там же. Если нужно отключить обратную отправку, то придётся работать с деревом с помощью JS, что не очень просто с учётом того, что он генерирует HTML таблицу, а не список (ul). Если нужен максимально гибкий вариант, то придётся отказаться от этого контрола и использовать более легковесные варианты.


    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа monteloro 9 ноября 2013 г. 7:32
    9 ноября 2013 г. 7:25
    Модератор
  • Спасибо большое, теперь все стало ясно.
    9 ноября 2013 г. 7:32
  • Скажите, пожалуйста, а как тогда сохранить визуальные стили при EnableClientScript="False"

                <HoverNodeStyle Font-Bold="True" Font-Italic="False" Font-Size="Medium" />
                <RootNodeStyle Font-Bold="True" />

    9 ноября 2013 г. 7:45
  • Придётся делать вручную. Это сложный контрол и всё реализовано за вас, поэтому если нет весомых причин не использовать обратную отправку, то лучше оставьте всё как есть. Вариант который предложил я максимально гибкий, но у него своя цена – придётся писать много кода вручную.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа monteloro 9 ноября 2013 г. 7:56
    9 ноября 2013 г. 7:52
    Модератор
  • Кроме перезагрузки страницы и не возможности использовать встроенные стили, никаких причин. Контрол хороший, спасибо.
                <HoverNodeStyle Font-Bold="True" Font-Italic="False" Font-Size="Medium" />
                <RootNodeStyle Font-Bold="True" />
    9 ноября 2013 г. 7:59
  • Первая решается использованием AJAX. Помещаете ваш контрол в UpdatePanel и никаких перезагрузок не будет. Подробнее об этом смотрите тут.

    Сделаем содержимое сообщества лучше, вместе!

    9 ноября 2013 г. 8:05
    Модератор
  • Да, спасибо большое, я так и понял, надеялся упростить себе жизнь. Еще один вопрос про Treeview, очень Вам признателен за помощь:

    Можно ли состояние узлов Treeview сохранять в пределах сессии?

    9 ноября 2013 г. 8:10
  • Если вы о том, что  контрол у вас на одной странице, а потом вы его покидаете и возвращаетесь туда же, после посещения другой страницы, то стандартного механизма нет. Придётся вам сохранять информацию об открытых узлах где-нибудь (например в состоянии сеанса), а после, при повторном запросе этой страницы и после привязки данных к контролу, перебрать нужные узлы в коде и изменить их состояние.

    Сделаем содержимое сообщества лучше, вместе!

    • Помечено в качестве ответа monteloro 9 ноября 2013 г. 8:21
    9 ноября 2013 г. 8:20
    Модератор
  • Именно об этом, спасибо за ответ, опять рассчитывал на чудо, а придется делать ручками.
    9 ноября 2013 г. 8:21
  • Чудес таких как правило не бывает. На то они и общие контролы. Более специфические задачи приходится решать самому. Просто можете покапаться в сети, многие сталкиваются с подобными проблемами часто, и иногда выкладывают их в сеть. Правда не думаю, что это тот случай, но всё же, попробовать стоит.

    Сделаем содержимое сообщества лучше, вместе!

    • Изменено YatajgaEditor 9 ноября 2013 г. 8:26
    • Помечено в качестве ответа monteloro 9 ноября 2013 г. 8:27
    9 ноября 2013 г. 8:25
    Модератор
  • Уважаемый Yatajga реализовал модель сохранение treeview вот таким образом, вроде все работает, но хотел узнать Ваше мнение:

        <asp:TreeView ID="TreeView1" runat="server" DataSourceID="XmlDataSource1" CssClass="TreeView1"
            ExpandDepth="0" EnableClientScript="True">
            <HoverNodeStyle Font-Bold="True" Font-Italic="False" Font-Size="Medium" />
            <LeafNodeStyle ImageUrl="~/Images/images/page_white_text.ico" />
            <RootNodeStyle Font-Bold="True" />
            <DataBindings>
                <asp:TreeNodeBinding DataMember="section" TextField="title" SelectAction="Expand" />
                <asp:TreeNodeBinding DataMember="subsection" TextField="title" NavigateUrlField="url" />
            </DataBindings>
        </asp:TreeView>
        <asp:XmlDataSource ID="XmlDataSource1" runat="server" DataFile="~/TestFolder/treeview0.xml"
            XPath="catalog/section"></asp:XmlDataSource>
        Protected Sub Page_SaveStateComplete(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.SaveStateComplete
            'чтение состояния узлов из сессии
            If Not (IsPostBack) Then
                If Not (Session("TreeNod") Is Nothing) Then
                    Dim i As Int16 = 0
                    Dim arr As New ArrayList
                    arr = Session("TreeNod")
                    For Each TreeNod As TreeNode In TreeView1.Nodes
                        If arr(i) Then TreeNod.Expand() Else TreeNod.Collapse()
                        i = i + 1
                    Next
                End If
            End If
        End Sub
    
        Protected Sub TreeView1_TreeNodeCollapsed(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.TreeNodeEventArgs) Handles TreeView1.TreeNodeCollapsed
            'сохранение состояния узлов Treeview в сессию 
            Dim arr As New ArrayList
            For Each TreeNod As TreeNode In TreeView1.Nodes
                arr.Add(TreeNod.Expanded)
            Next
            Session("TreeNod") = arr
        End Sub
    
        Protected Sub TreeView1_TreeNodeExpanded(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.TreeNodeEventArgs) Handles TreeView1.TreeNodeExpanded
            'сохранение состояния узлов Treeview в сессию
            Dim arr As New ArrayList
            For Each TreeNod As TreeNode In TreeView1.Nodes
                arr.Add(TreeNod.Expanded)
            Next
            Session("TreeNod") = arr
        End Sub


    Заранее благодарю.



    • Изменено monteloro 9 ноября 2013 г. 21:41
    9 ноября 2013 г. 20:13