将标签拖放到asp.net中的面板

时间:2011-11-26 18:41:04

标签: javascript asp.net

我知道如何在Windows应用程序中拖放,但我无法在asp:label控件中找到mousedown事件。

知道怎么做吗?

1 个答案:

答案 0 :(得分:0)

正如John Saunders所说,你需要在这里使用客户端脚本。

我可能建议使用jQuery-UI与一些服务器端代码。检查下面的代码:它允许将标签拖放到droppable控件上(在此示例中仅为Panel1)并将该控件的id保存在label的子隐藏字段的值中。稍后在服务器端回发时,您需要检查此新标签的父ID值,并在需要时将标签移动到新的父控件。要检查此代码,您需要引用jQuery和jQuery-UI库文件。

JavaScript的:

$(function () {
    $("#<%= Label1.ClientID %>").draggable({ revert: "invalid" });

    $("#<%= Panel1.ClientID %>").droppable({
        activeClass: "ui-state-hover",
        hoverClass: "ui-state-active",
        drop: function (event, ui) {
            $(ui.draggable).css({
                "position": "",
                "left": "",
                "top": ""
            });

            $("#<%= Label1Parent.ClientID %>").val(this.id);

            $(this).append(ui.draggable);
        }
    });
});

标记:

<asp:Panel runat="server" ID="Panel1" Style="border: 1px solid #000; width: 300px;
    height: 300px;">
</asp:Panel>
<asp:Label runat="server" ID="Label1">Some label</asp:Label>
<asp:HiddenField runat="server" ID="Label1Parent" />
<asp:Button runat="server" Text="Just some postback button" />

服务器端代码:

protected void Page_Load(object sender, EventArgs e)
{
    if (IsPostBack)
    {
        if (!string.IsNullOrEmpty(Label1Parent.Value) && Label1.Parent.ClientID != Label1Parent.Value)
        {
            Label1.Parent.Controls.Remove(Label1);
            var newParent = FindControlRecursive(Page, Label1Parent.Value);
            newParent.Controls.Add(Label1);
        }
    }
}

private static Control FindControlRecursive(Control rootControl, string clientID)
{
    if (rootControl.ClientID == clientID) 
        return rootControl;

    foreach (Control controlToSearch in rootControl.Controls)
    {
        var controlToReturn = FindControlRecursive(controlToSearch, clientID);

        if (controlToReturn != null) 
            return controlToReturn;
    }
    return null;
}