none
Редактирование TreeView пользователем

    Вопрос

  • Добрый день!

    Нужно сделать подобное http://www.obout.com/t2/ht_EditableNodes.aspx

    Пока не могу с ориентироваться с какой стороны нужно зайти.

    Ссылки и примеры приветствуются. 

    25 июля 2017 г. 12:28

Все ответы

  • Технология какая? Если ASP.NET Web Forms, то есть уже готовый контрол TreeView, вам нужно стили поменять и всё.

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

    26 июля 2017 г. 7:28
    Модератор
  • Добрый день!

    Максим, вы совершенно правы на счет технологии. 

    Я не знаток ASP.NET Web Forms, но у меня есть сомнения, что я могу решить задачу просто определив стили.

    В моём понимании Стиль-это оформление контрола, а не его функционал. Но спорить не буду. Если не затруднить, то сможете показать пример или ссылку на нечто подобное.

    27 июля 2017 г. 17:34
  • Стандартный TreeView не заточен под редактирование на клиенте. С ним только можно сделать как-то так

    - положить на страницу невидимый TextBox

    - при выборе элемента в TreeView сделать TextBox видимым

    - JS-скриптом запихать его в нужную ячейку TreeView (он рендерится в HTML как таблица), скрыть исходный элемент

    - при потере фокуса TextBox сохранить новое значение и все вернуть назад

    Чтобы нормальное клиентское редактирование сделать, наверное надо взять с CodeProject ASP.NET AJAX TreeView control with templates, он поддерживает режим редактирования.

    28 июля 2017 г. 5:52
  • Вадим, спасибо за ваш ответ.

    Я пришёл к такому же решению, что и вы.

    Текущая проблема - это получить возможность редактирования по OnDblClic.

    OnClic с вызовом функции с параметрами генерит ASP я не могу вставить в  TreeView OnDblClic.

    Если подскажете как это провернуть буду признателен.

    Спасибо за ссылку. Я на этом же сайте читаю статью - перехват событий до отправки их на сервер.

    Вот статья Пока не разобрался как перехватить события (пишу на VB)

    Однако, ваше предложение однозначно в копилку.

    28 июля 2017 г. 17:42
  • Статья по ссылке написана в 2005 году, и соответствует версии ASP.NET 1.0. Она могла устареть в техническом плане (используемые идеи, конечно, все еще применимы, но буквальный код может не работать). Для организации обработки событий на клиенте, следует понимать следующее:

    • Вы можете получить клиентский идентификатор большинства ASP.NET-элементов в JS коде с помощью вставки  <?=myControl.ClientID ?> (ну по крайней мере это в C# так, не знаю как в VB синтаксис выглядит). В крайнем случае, можно врубить ClientIdMode=Static и зашить в коде жесткий ID  
    • По клиентскому идентификатору, с помощью document.GetElementById, можно получить сам объект. Информацию о том, что умеет этот объект, можно узнать в документации, скажем, на сайте w3schools.com. Например TreeView в HTML это Table, который имеет событие ondblclick.
    • Чтобы запланировать запуск определенного клиентского сценария, можно использовать свойство Page.ClientScript. Оно возвращает объект ClientScriptManager, у которого есть метод RegisterStartupScript
    • Если от клиентского скрипта нужно перейти к обработки на сервере, можно вызвать в JS функцию __doPostBack("clientId", null). Она вызовет отправку страницы на сервер, как будто была нажата кнопка с указанным ClientId.
    • Для обмена информацией между серверным и клиентским кодом удобно использовать HiddenField.

    Используя эти принципы, можно реализовать то что вы хотите, комбинируя серверный и клиентский код. На страндартном TreeView это сложновато, но возможно.

    29 июля 2017 г. 11:53
  • Вадим, спасибо за развернутый ответ.

    Есть еще вопросы. Буду признателен за любую помощь.

    Table, который имеет событие ondblclick."

    ASP в TreeView не генерит ondblclick я сделал свой обработчик двойного клика но использовать его мешает  __doPostBack отправляя страницу на сервер. 

    Подскажите  как отключить __doPostBack 

    И в правильном ли направлении я иду? Возможно при отключении __doPostBack перестанут работать события в коде?

    3 августа 2017 г. 5:29
  • Попробуйте у всех TreeNode установить SelectAction=TreeNodeSelectAction.None, должно отключить автоматический postback.
    3 августа 2017 г. 6:04
  • Вадим, добрый день!

    SelectAction=TreeNodeSelectAction.Noneотключает автоматический postback и одновременно с ним пропадает обработка в коде и события onclick и dblclick 

    Учитывая фактор времени и затраченных сил решил зайти со стороны постройки собственного дерева...

    Динамически создать элемент получилось,

            Dim i As Integer
            Dim numlabels As Integer = 5
    
            For i = 1 To numlabels
                Dim myLabel As Label = New Label()
                myLabel.Text = "Label " & i
                myLabel.ID = "Label_Mu" & i
                Panel2.Controls.Add(myLabel)
                Dim spacer As LiteralControl = New LiteralControl("<br />")
                Panel2.Controls.Add(spacer)
            Next

    Не могу (не знаю) как присвоить динамически созданному объекту события onclick и dblclick. Сможете дать направление?

    11 августа 2017 г. 11:05
  • Конкретно для Literal, внезапно, это невозможно. Literal не является отдельным элементом в HTML, он просто вставляет свой текст в страницу как есть. Используйте Label, у него можно добавить обработчик через коллекцию label.Attributes
    11 августа 2017 г. 16:18