2010-07-07 89 views
1

我在TreeView控件中填充了数据。我将如何从父节点中拖动某个特定的子节点并将其拖放到DIV或任何部分,使用JQUERY?我知道在jQuery中,有“可拖动”和“可拖拽”的方法,使这成为可能。但我想拖动一个特定的子节点并放下它。拖放子节点

或atleast如何使用jQuery获取特定子节点的文本/ ID?我希望我可以拖动,如果如果你有以下ASPX我可以获取子节点

回答

1

好,我将其添加为另一种答案,因为评论框是小,

要隐藏/显示项目的同时拖动可以使用的启动和停止的事件。

本示例在拖动时显示/隐藏treenode文本旁边的+/-(折叠/非折叠)图标,但您可以轻松修改它以隐藏/显示复选框(如果存在)。

<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()); 
     } 
    }); 
}); 

我会尝试看看克隆问题。

- 编辑 -

显然克隆问题仅在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 attr中的值)。

您在放置函数中的JavaScript可能如下所示。 (仍然需要做一些检查为空值ofcourse)

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

或者你也可以通过继承树节点使其干净了一点客户方和一个div中,你把你的客户方定制attribut包裹每树节点ID。

您的自定义树节点可能看起来像这样

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应用(先注册你自定义Web控制组件)

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

,而不是

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

和你javascript保持干净整洁

alert($(ui.draggable).parent().attr("id")); 
+0

我将如何检索拖动节点的值? – 2010-07-12 11:12:01

+0

谢谢Steffan .....最后我得到了我想要的......文字和价值。 – 2010-07-13 09:29:42

+0

还有一件事Steffan!我只想拖动子节点。我不必拖动父节点。那么,我将如何让只有子节点可拖动?我应该在可以拖动的上面的jQuery中做什么? – 2010-07-13 09:37:15

2

<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库。

如果你打算拖拽一个treenode及其子节点,你可能会有一些乐趣,因为显然树节点被呈现为一个表格(对于父级)和一个带有子级别的div。没有div包装两者。

也许你可以重写TreeView派生类中的RenderContents,并自己递归地处理treenodes的渲染,但听起来像是包装两个元素的很多工作。

也许更好的选择是使用JQuery插件来渲染你的treelist。

+0

嗨Stefaan ...我试过了。我可以拖动一些问题。我在“draggable”中通过了“{helper:clone}”作为参数。问题如下: 1.拖动节点后,文本会在拖动时显示两次。同时作为警报消息。该警报将显示两次,因为文本在拖动时显示两次 2.拖放拖动的节点后,会出现运行时脚本错误,指出“originalTargetText.text为空或不是对象”。同名警报消息,错误消息还显示两次与拖动节点文本显示两次相关。 我认为这是我想要的。除了上述问题。 – 2010-07-08 05:14:14

+0

这里我已经在“draggable()”方法中传递了“helper:'clone'”参数,其中节点显示了两次,也是警报消息。如果我不在“draggable()”方法中传递“helper:clone”,节点只显示一次,但每次拖动节点时,节点文本都会与鼠标指针分离。我不想移动节点。当我拖动时,我希望它在TreeView本身中存在,并且节点文本应该在拖动时与鼠标指针一起显示。另外如何消除复选框,而拖动?我只想要拖动子节点,因为我的工作只需要这个。 – 2010-07-08 05:23:52

+0

显然,null引用错误仅在IE中,所以使用ui.draggable.text()而不是event.originalTarget.text。如果我今天找到时间,我会看看其他问题。 – Stefaan 2010-07-09 08:40:31