Перетащите дочерний узел

Я заполнил данные в элементе управления TreeView. Как я перетащу конкретный дочерний узел из родительского узла и перетащу его в DIV или любую часть, используя JQUERY? Я знаю, что в jquery есть методы «перетаскивание» и «удаление», чтобы сделать это возможным. Но я хочу перетащить конкретный дочерний узел и удалить его.

Или, по крайней мере, как получить текст/идентификатор определенного дочернего узла с помощью jquery? Я надеюсь, что смогу перетащить, если смогу получить дочерний узел


person Sreejesh Kumar    schedule 07.07.2010    source источник


Ответы (2)


Хорошо, я добавляю это как еще один ответ, потому что поле для комментариев слишком маленькое,

Чтобы скрыть/показать элемент во время перетаскивания, вы можете использовать события запуска и остановки.

В этом примере отображается/скрывается значок +/- (свернуть/развернуть) рядом с текстом узла дерева при перетаскивании, но вы можете легко изменить его, чтобы скрыть/показать флажки, если они есть.

<script type="text/javascript">
$(function () {
    $(".treeNode").draggable({
            start: function (event, ui) {

                var previousTd = $(this).parent().prev() ;
                $("img", previousTd).css("visibility", "hidden");
            },
            stop: function (event, ui) {
                var previousTd = $(this).parent().prev();
                $("img", previousTd).css("visibility", "visible");
            });
    $("#<%= TreeView1.ClientID%>").droppable({
        drop: function (event, ui) {
            alert(ui.draggable.text());
        }
    });
});

I'll try to have a look at the clone problem.

-- изменить --

Судя по всему, проблема с клонированием есть только в IE и вызвана

 <NodeStyle CssClass="treeNode" />

В сочетании с

$(".treeNode").draggable(...

Это помещает класс treeNode не только в тег «a», но и в окружающий тег «td». Таким образом, с помощью селектора .treeNode метод перетаскивания выполняется дважды... В FF это не так.

Вы можете решить эту проблему, просто изменив селектор в «#‹%= TreeView1.ClientID%> a.treeNode». Таким образом, с помощью вышеупомянутого aspx вы получите следующий скрипт.

    $(function () {
        $("#<%= TreeView1.ClientID%> a.treeNode").draggable({
            appendTo: 'body',
            helper: 'clone',
            start: function (event, ui) {

                var previousTd = $(this).parent().prev();
                $("img", previousTd).css("visibility", "hidden");
            },
            stop: function (event, ui) {
                var previousTd = $(this).parent().prev();
                $("img", previousTd).css("visibility", "visible");
            },
            zIndex: '100'
        });

        $("#<%= TreeView1.ClientID%>").droppable({
            drop: function (event, ui) {
                alert(ui.draggable.text());
            }
        });
    });
</script>

-- изменить --

В ответ на ваш комментарий:

Чтобы получить значение перетаскиваемого узла, вы можете использовать манипуляции со строками javascript, чтобы отфильтровать его из атрибута href (treenode отображает значение в атрибуте href).

Ваш javascript в функции drop может выглядеть следующим образом. (все еще нужно сделать некоторую проверку нулевых значений, конечно)

var hrefParts = $(ui.draggable.context.href.split("\\"));
var nodeValue = hrefParts[hrefParts.length - 1];
nodeValue = nodeValue.substring(0, nodeValue.length - 2);
alert(nodeValue);                    

Или вы можете сделать его немного чище на стороне клиента, унаследовав Treenode и обернув каждый Treenode div с настраиваемым атрибутом, в который вы помещаете свой идентификатор на стороне клиента.

Ваш пользовательский узел дерева может выглядеть так

public class WrappedTreeNode : TreeNode
{
    public string ClientValue { get; set; }

    protected override void RenderPreText(HtmlTextWriter writer)
    {
        writer.WriteBeginTag("div");
        //you can simply use the base.Value aswell here if you want them to be the same
        writer.WriteAttribute("id", ClientValue);
        base.RenderPreText(writer);
    }

    protected override void RenderPostText(HtmlTextWriter writer)
    {
        base.RenderPostText(writer);
        writer.WriteEndTag("div");
    }        
}

Затем при использовании aspx (сначала зарегистрируйте пользовательскую сборку веб-элемента управления)

<ServerControls:WrappedTreeNode Text="Bradley" ClientValue="ID-1221"/>

вместо

<asp:TreeNode Text="Bradley" Value="ID-1221"/>

И ваш javascript остается красивым и чистым

alert($(ui.draggable).parent().attr("id"));
person Stefaan    schedule 09.07.2010
comment
Как я получу значение перетаскиваемого узла? - person Sreejesh Kumar; 12.07.2010
comment
Еще одно, Стеффан! Я хочу перетаскивать только дочерние узлы. Мне не нужно перетаскивать родительские узлы. Итак, как я могу сделать перетаскиваемыми только дочерние узлы? Что мне делать в приведенном выше jquery при перетаскивании? - person Sreejesh Kumar; 13.07.2010
comment
Вы получили идентификатор с помощью производного TreeNode или путем фильтрации атрибута href? Если вы сделали это через производный класс узла дерева, вы можете легко проверить, есть ли у узла дочерние узлы (base.ChildNodes.Count > 0) в методе RenderPreText, и добавить класс в окружающий div. Затем измените свой селектор JQuery для перетаскиваемого события соответствующим образом. Вот как (= производный TreeNode) я бы сделал это, поскольку я не вижу никакого чистого способа сделать это, изменив перетаскиваемый селектор, не вдаваясь в какое-то уродливое строковое программирование. - person Stefaan; 13.07.2010

Если у вас есть следующий aspx

<asp:TreeView ID="TreeView1" runat="server">
    <Nodes>
        <asp:TreeNode Text="Employees">
            <asp:TreeNode Text="HR" Value="SubClass1">
                <asp:TreeNode Text="Bradley" Value="ID-1234" />
                <asp:TreeNode Text="Whitney" Value="ID-5678" />
                <asp:TreeNode Text="Barbara" Value="ID-9101" />
            </asp:TreeNode>
            <asp:TreeNode Text="IT" Value="SubClass2">
                <asp:TreeNode Text="Jimmy" Value="ID-5587" />
                <asp:TreeNode Text="Samantha" Value="ID-5474" />
                <asp:TreeNode Text="Freddy" Value="ID-2001" />
            </asp:TreeNode>
        </asp:TreeNode>
    </Nodes>
    <NodeStyle CssClass="treeNode" />
</asp:TreeView>

Добавлять

<script type="text/javascript">
    $(function () {
        $(".treeNode").draggable();
        $("#<%= TreeView1.ClientID%>").droppable({
            drop: function (event, ui) {
                alert(event.originalTarget.text);
            }
        });
    });
</script>

Чтобы отобразить текст удаленного узла.

Однако вам понадобятся библиотеки jquery.ui.

Если вы планируете перетаскивать узел дерева с его дочерними узлами, вам может быть интересно, поскольку, очевидно, узел дерева отображается как таблица (для родителя) и div с дочерними элементами. Там нет div-обертки.

Может быть, вы могли бы переопределить RenderContents в классе, производном от TreeView, и рекурсивно обрабатывать рендеринг узлов дерева самостоятельно, но звучит как много работы только для того, чтобы обернуть два элемента.

Возможно, лучшим выбором будет использование плагина JQuery для отображения вашего древовидного списка.

person Stefaan    schedule 07.07.2010
comment
привет Стефан ... Я попробовал это. Я могу перетаскивать, но есть некоторые проблемы. Я передал {helper:clone} в качестве параметра в draggable. проблемы заключаются в следующем: 1. Как только я перетаскиваю узел, текст отображается дважды при перетаскивании. То же, что и предупреждающее сообщение. предупреждение отображается дважды из-за того, что текст отображается дважды при перетаскивании 2. После того, как я отбрасываю перетаскиваемый узел, возникает ошибка сценария выполнения, говорящая, что originalTargetText.text является нулевым или не является объектом. То же, что и предупреждающее сообщение, сообщение об ошибке также отображается дважды, связанное с текст перетаскиваемого узла отображается дважды. Я думаю, это было то, что я хотел. кроме вышеперечисленных проблем. - person Sreejesh Kumar; 08.07.2010
comment
Здесь я передал helper:'clone' в качестве параметра в методе draggable(), где узел показывался дважды, а также предупреждающие сообщения. И если я не передам helper:clone в методе draggable(), узел отображается только один раз, но каждый раз, когда я перетаскиваю узел, текст узла отделяется от указателя мыши. Я не хочу перемещать узел. Пока я перетаскиваю, я хочу, чтобы он был в самом TreeView, и текст узла должен отображаться вместе с указателем мыши при перетаскивании. Также как убрать флажок при перетаскивании? И я хочу, чтобы перетаскивались только дочерние узлы, так как моей работе нужно только это. - person Sreejesh Kumar; 08.07.2010
comment
По-видимому, ошибка нулевой ссылки есть только в IE, поэтому используйте ui.draggable.text() вместо event.originalTarget.text. Я посмотрю на другие вопросы, если я найду время сегодня. - person Stefaan; 09.07.2010