好的,我将其添加为另一个答案,因为评论框太小,
要在拖动时隐藏/显示项目,您可以使用开始和停止事件。
此示例在拖动时显示/隐藏树节点文本旁边的 +/-(折叠/展开)图标,但您可以轻松修改它以隐藏/显示复选框(如果存在)。
<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 选择器,draggable 方法被执行了两次……这在 FF 中不是这样的。
您只需更改“# 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 中的值)。
您在 drop 函数中的 javascript 可能如下所示。 (当然还需要检查空值)
var hrefParts = $(ui.draggable.context.href.split("\\"));
var nodeValue = hrefParts[hrefParts.length - 1];
nodeValue = nodeValue.substring(0, nodeValue.length - 2);
alert(nodeValue);
或者您可以通过继承 Treenode 并使用带有自定义属性的 div 包装每个 Treenode 来使其客户端更简洁,您可以在其中放置客户端 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"));