I am building a page that will dynamically load user controls based on database input.
As an experiment, I put the RadGrid drag and drop example into a user control and placed it on a test page. The page and demo operated as expected.
I then replaced the user control element with a placeholder element and in the Page_Load of the test page, dynamically loaded the web user control with the RadGrid drag and drop demo on it.
The drag and drop seems to work ONCE. But then the controls basically freeze after this. The only thing that works seems to be the pager on the pending orders grid. All of the drag and drop is gone. Is there a way to make this work?
Greg
Test.aspx
Test.aspx.cs
Advanced Library.ascx
Advanced Library.ascx.cs
As an experiment, I put the RadGrid drag and drop example into a user control and placed it on a test page. The page and demo operated as expected.
I then replaced the user control element with a placeholder element and in the Page_Load of the test page, dynamically loaded the web user control with the RadGrid drag and drop demo on it.
The drag and drop seems to work ONCE. But then the controls basically freeze after this. The only thing that works seems to be the pager on the pending orders grid. All of the drag and drop is gone. Is there a way to make this work?
Greg
Test.aspx
| <%@ Page Language="c#" AutoEventWireup="true" CodeFile="Test.aspx.cs" Inherits="Test" %> |
| <%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %> |
| <%@ Reference Control="~/Advanced Library.ascx" %> |
| <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> |
| <html xmlns="http://www.w3.org/1999/xhtml"> |
| <head id="Head1" runat="server"> |
| </head> |
| <body class="BODY"> |
| <form id="mainForm" method="post" runat="server"> |
| <asp:ScriptManager ID="ScriptManager1" runat="server"> |
| </asp:ScriptManager> |
| <asp:PlaceHolder ID="PlaceHolder1" runat="server"></asp:PlaceHolder> |
| </form> |
| </body> |
| </html> |
Test.aspx.cs
| using System; |
| using System.Collections.Generic; |
| using System.Configuration; |
| using System.Data; |
| using System.Data.Common; |
| using System.Data.SqlClient; |
| using System.Web.UI; |
| public partial class Test : System.Web.UI.Page |
| { |
| protected void Page_Load(object sender, System.EventArgs e) |
| { |
| CMS_UserControls_Advanced_Library ctrl = (CMS_UserControls_Advanced_Library)Page.LoadControl("~/Advanced Library.ascx"); |
| PlaceHolder1.Controls.Add(ctrl); |
| } |
| } |
Advanced Library.ascx
| <%@ Control Language="C#" AutoEventWireup="true" CodeFile="Advanced Library.ascx.cs" |
| Inherits="CMS_UserControls_Advanced_Library" ClassName="CMS_UserControls_Advanced_Library" %> |
| <%@ Register TagPrefix="telerik" Namespace="Telerik.Web.UI" Assembly="Telerik.Web.UI" %> |
| <telerik:RadAjaxLoadingPanel ID="RadAjaxLoadingPanel1" runat="server" /> |
| <telerik:RadAjaxManager runat="server" ID="radAjax" DefaultLoadingPanelID="RadAjaxLoadingPanel1"> |
| <AjaxSettings> |
| <telerik:AjaxSetting AjaxControlID="grdPendingOrders"> |
| <UpdatedControls> |
| <telerik:AjaxUpdatedControl ControlID="grdPendingOrders" /> |
| <telerik:AjaxUpdatedControl ControlID="grdShippedOrders" /> |
| <telerik:AjaxUpdatedControl ControlID="msg" /> |
| </UpdatedControls> |
| </telerik:AjaxSetting> |
| <telerik:AjaxSetting AjaxControlID="grdShippedOrders"> |
| <UpdatedControls> |
| <telerik:AjaxUpdatedControl ControlID="grdShippedOrders" /> |
| <telerik:AjaxUpdatedControl ControlID="msg" /> |
| </UpdatedControls> |
| </telerik:AjaxSetting> |
| </AjaxSettings> |
| </telerik:RadAjaxManager> |
| <telerik:RadScriptBlock runat="server" ID="scriptBlock"> |
| <script type="text/javascript"> |
| <!-- |
| function onRowDropping(sender, args) { |
| if (sender.get_id() == "<%=grdPendingOrders.ClientID %>") { |
| var node = args.get_destinationHtmlElement(); |
| if (!isChildOf('<%=grdShippedOrders.ClientID %>', node) && !isChildOf('<%=grdPendingOrders.ClientID %>', node)) { |
| args.set_cancel(true); |
| } |
| } |
| else { |
| var node = args.get_destinationHtmlElement(); |
| if (!isChildOf('trashCan', node)) { |
| args.set_cancel(true); |
| } |
| else { |
| if (confirm("Are you sure you want to delete this order?")) |
| args.set_destinationHtmlElement($get('trashCan')); |
| else |
| args.set_cancel(true); |
| } |
| } |
| } |
| function isChildOf(parentId, element) { |
| while (element) { |
| if (element.id && element.id.indexOf(parentId) > -1) { |
| return true; |
| } |
| elementelement = element.parentNode; |
| } |
| return false; |
| } |
| --> |
| </script> |
| </telerik:RadScriptBlock> |
| <div class="exWrap"> |
| <div style="float: left; padding: 0 6px 0 10px"> |
| <h2 style="color: #9c3608"> |
| Pending Orders</h2> |
| <telerik:RadGrid runat="server" ID="grdPendingOrders" OnNeedDataSource="grdPendingOrders_NeedDataSource" |
| AllowPaging="True" Width="350px" OnRowDrop="grdPendingOrders_RowDrop" AllowMultiRowSelection="true" |
| PageSize="30"> |
| <MasterTableView DataKeyNames="OrderId" Width="95%" TableLayout="Fixed"> |
| </MasterTableView> |
| <ClientSettings AllowRowsDragDrop="True"> |
| <Selecting AllowRowSelect="True" EnableDragToSelectRows="true" /> |
| <ClientEvents OnRowDropping="onRowDropping" /> |
| <Scrolling AllowScroll="true" UseStaticHeaders="true" /> |
| </ClientSettings> |
| <PagerStyle Mode="NextPrevAndNumeric" /> |
| </telerik:RadGrid> |
| </div> |
| <div style="float: right; padding: 0 10px 0 6px"> |
| <h2 style="color: #3c8b04"> |
| Shipped Orders</h2> |
| <telerik:RadGrid runat="server" AllowPaging="True" ID="grdShippedOrders" OnNeedDataSource="grdShippedOrders_NeedDataSource" |
| Width="350px" OnRowDrop="grdShippedOrders_RowDrop" AllowMultiRowSelection="true"> |
| <MasterTableView DataKeyNames="OrderId" Width="100%"> |
| <NoRecordsTemplate> |
| <div style="height: 30px; cursor: pointer;"> |
| No items to view</div> |
| </NoRecordsTemplate> |
| </MasterTableView> |
| <ClientSettings AllowRowsDragDrop="True"> |
| <Selecting AllowRowSelect="True" EnableDragToSelectRows="true" /> |
| <ClientEvents OnRowDropping="onRowDropping" /> |
| </ClientSettings> |
| </telerik:RadGrid> |
| </div> |
| <div style="clear: both;"> |
| <!-- --> |
| </div> |
| <div class="exFooter"> |
| <a id="trashCan" href="#" onclick="return false;">Recycle Bin</a> |
| <div class="exMessage" runat="server" id="msg" visible="false" enableviewstate="false"> |
| Order(s) successfully deleted! |
| </div> |
| </div> |
| <br /> |
| </div> |
Advanced Library.ascx.cs
| using System; |
| using System.Collections; |
| using System.Configuration; |
| using System.Data; |
| using System.Linq; |
| using System.Web; |
| using System.Web.Security; |
| using System.Web.UI; |
| using System.Web.UI.HtmlControls; |
| using System.Web.UI.WebControls; |
| using System.Web.UI.WebControls.WebParts; |
| using System.Xml.Linq; |
| using System.Collections.Generic; |
| using Telerik.Web.UI; |
| public partial class CMS_UserControls_Advanced_Library : System.Web.UI.UserControl |
| { |
| protected IList<Order> PendingOrders |
| { |
| get |
| { |
| try |
| { |
| object obj = Session["PendingOrders"]; |
| if (obj == null) |
| { |
| obj = GetOrders(); |
| if (obj != null) |
| { |
| Session["PendingOrders"] = obj; |
| } |
| else |
| { |
| obj = new List<Order>(); |
| } |
| } |
| return (IList<Order>)obj; |
| } |
| catch |
| { |
| Session["PendingOrders"] = null; |
| } |
| return new List<Order>(); |
| } |
| set { Session["PendingOrders"] = value; } |
| } |
| protected IList<Order> ShippedOrders |
| { |
| get |
| { |
| try |
| { |
| object obj = Session["ShippedOrders"]; |
| if (obj == null) |
| { |
| Session["ShippedOrders"] = obj = new List<Order>(); |
| } |
| return (IList<Order>)obj; |
| } |
| catch |
| { |
| Session["ShippedOrders"] = null; |
| } |
| return new List<Order>(); |
| } |
| set { Session["ShippedOrders"] = value; } |
| } |
| protected void grdPendingOrders_NeedDataSource(object source, GridNeedDataSourceEventArgs e) |
| { |
| grdPendingOrders.DataSource = PendingOrders; |
| } |
| protected IList<Order> GetOrders() |
| { |
| IList<Order> results = new List<Order>(); |
| results.Add(new Order(1, "A", "B", "C")); |
| results.Add(new Order(2, "A", "B", "C")); |
| results.Add(new Order(3, "A", "B", "C")); |
| results.Add(new Order(4, "A", "B", "C")); |
| results.Add(new Order(5, "A", "B", "C")); |
| results.Add(new Order(6, "A", "B", "C")); |
| results.Add(new Order(7, "A", "B", "C")); |
| results.Add(new Order(8, "A", "B", "C")); |
| results.Add(new Order(9, "A", "B", "C")); |
| results.Add(new Order(10, "A", "B", "C")); |
| results.Add(new Order(11, "A", "B", "C")); |
| return results; |
| } |
| protected void grdShippedOrders_NeedDataSource(object source, GridNeedDataSourceEventArgs e) |
| { |
| grdShippedOrders.DataSource = ShippedOrders; |
| } |
| protected void grdPendingOrders_RowDrop(object sender, GridDragDropEventArgs e) |
| { |
| if (string.IsNullOrEmpty(e.HtmlElement)) |
| { |
| if (e.DraggedItems[0].OwnerGridID == grdPendingOrders.ClientID) |
| { |
| // items are drag from pending to shipped grid |
| if ((e.DestDataItem == null && ShippedOrders.Count == 0) || |
| e.DestDataItem != null && e.DestDataItem.OwnerGridID == grdShippedOrders.ClientID) |
| { |
| IList<Order> shippedOrders = ShippedOrders; |
| IList<Order> pendingOrders = PendingOrders; |
| int destinationIndex = -1; |
| if (e.DestDataItem != null) |
| { |
| Order order = GetOrder(shippedOrders, (int)e.DestDataItem.GetDataKeyValue("OrderId")); |
| destinationIndex = (order != null) ? shippedOrders.IndexOf(order) : -1; |
| } |
| foreach (GridDataItem draggedItem in e.DraggedItems) |
| { |
| Order tmpOrder = GetOrder(pendingOrders, (int)draggedItem.GetDataKeyValue("OrderId")); |
| if (tmpOrder != null) |
| { |
| if (destinationIndex > -1) |
| { |
| shippedOrders.Insert(destinationIndex, tmpOrder); |
| } |
| else |
| { |
| shippedOrders.Add(tmpOrder); |
| } |
| pendingOrders.Remove(tmpOrder); |
| } |
| } |
| ShippedOrders = shippedOrders; |
| PendingOrders = pendingOrders; |
| grdPendingOrders.Rebind(); |
| grdShippedOrders.Rebind(); |
| } |
| else if (e.DestDataItem != null && e.DestDataItem.OwnerGridID == grdPendingOrders.ClientID) |
| { |
| //reorder items in pending grid |
| IList<Order> pendingOrders = PendingOrders; |
| Order order = GetOrder(pendingOrders, (int)e.DestDataItem.GetDataKeyValue("OrderId")); |
| int destinationIndex = pendingOrders.IndexOf(order); |
| if (e.DropPosition == GridItemDropPosition.Above && e.DestDataItem.ItemIndex > e.DraggedItems[0].ItemIndex) |
| { |
| destinationIndex -= 1; |
| } |
| if (e.DropPosition == GridItemDropPosition.Below && e.DestDataItem.ItemIndex < e.DraggedItems[0].ItemIndex) |
| { |
| destinationIndex += 1; |
| } |
| List<Order> ordersToMove = new List<Order>(); |
| foreach (GridDataItem draggedItem in e.DraggedItems) |
| { |
| Order tmpOrder = GetOrder(pendingOrders, (int)draggedItem.GetDataKeyValue("OrderId")); |
| if (tmpOrder != null) |
| ordersToMove.Add(tmpOrder); |
| } |
| foreach (Order orderToMove in ordersToMove) |
| { |
| pendingOrders.Remove(orderToMove); |
| pendingOrders.Insert(destinationIndex, orderToMove); |
| } |
| PendingOrders = pendingOrders; |
| grdPendingOrders.Rebind(); |
| e.DestDataItem.Selected = true; |
| } |
| } |
| } |
| } |
| private static Order GetOrder(IEnumerable<Order> ordersToSearchIn, int orderId) |
| { |
| foreach (Order order in ordersToSearchIn) |
| { |
| if (order.OrderID == orderId) |
| { |
| return order; |
| } |
| } |
| return null; |
| } |
| protected void grdShippedOrders_RowDrop(object sender, GridDragDropEventArgs e) |
| { |
| if (!string.IsNullOrEmpty(e.HtmlElement) && e.HtmlElement == "trashCan") |
| { |
| IList<Order> shippedOrders = ShippedOrders; |
| bool deleted = false; |
| foreach (GridDataItem draggedItem in e.DraggedItems) |
| { |
| Order tmpOrder = GetOrder(shippedOrders, (int)draggedItem.GetDataKeyValue("OrderId")); |
| if (tmpOrder != null) |
| { |
| shippedOrders.Remove(tmpOrder); |
| deleted = true; |
| } |
| } |
| if (deleted) |
| { |
| msg.Visible = true; |
| } |
| ShippedOrders = shippedOrders; |
| grdShippedOrders.Rebind(); |
| } |
| } |
| #region Nested type: Order |
| protected class Order |
| { |
| private string _companyName; |
| private string _customerId; |
| private int _orderId; |
| private string _date; |
| public Order(int orderId, string customerId, string companyName, string requiredDate) |
| { |
| _orderId = orderId; |
| _customerId = customerId; |
| _companyName = companyName; |
| _date = requiredDate; |
| } |
| public int OrderID |
| { |
| get { return _orderId; } |
| } |
| public string CustomerID |
| { |
| get { return _customerId; } |
| } |
| public string Company |
| { |
| get { return _companyName; } |
| } |
| public string Date |
| { |
| get { return _date; } |
| } |
| } |
| #endregion |
| } |