This is a migrated thread and some comments may be shown as answers.

Self Referencing Drag and Drop TreeList object Root level insert doesn't fire Insert Command

2 Answers 90 Views
TreeList
This is a migrated thread and some comments may be shown as answers.
Kevin
Top achievements
Rank 1
Kevin asked on 20 Sep 2012, 05:27 AM
I am having a problem with the TreeList.  I am able to populate the list with parent and children elements.  I can update and delete just fine.  I can also Insert a new child element just fine.  However when I try to insert a root level element with debugging enabled I have not been able to get the InsertCommand to fire.  I am also using a user control for the editor.  Here is my code as it is. 

.aspx Page:

<div id="DropUnderWrapper">
    <asp:CheckBox ID="IsUnder" runat="server" Text=" Drop Under Parent" />
</div>
<telerik:RadTreeList ID="MenuManager" runat="server">
    <Columns>
        <telerik:TreeListBoundColumn DataField="MenuText" HeaderText="Menu Name" UniqueName="Name" />
        <telerik:TreeListHyperLinkColumn DataNavigateUrlFields="SitePageID" DataNavigateUrlFormatString="/admin/pageManager/?CID={0}" DataTextField="PageTitle" HeaderText="Url Title" UniqueName="PageTitle"  />
        <telerik:TreeListBoundColumn DataField="MenuUrl" HeaderText="Url" UniqueName="MenuUrl" />
        <telerik:TreeListBoundColumn DataField="MenuTarget" HeaderText="Target" UniqueName="MenuTarget" HeaderStyle-Width="60px" />
        <telerik:TreeListBoundColumn DataField="IsEnabled" HeaderText="Status" UniqueName="MenuItemEnabled" HeaderStyle-Width="60px" />
        <telerik:TreeListEditCommandColumn ButtonType="ImageButton" HeaderStyle-Width="60px" AddRecordText="Add Menu Item" Reorderable="false" />
        <telerik:TreeListButtonColumn ButtonType="ImageButton" ButtonCssClass="deleteConfirm" CommandName="Delete" HeaderStyle-Width="30px" />
    </Columns>
    <EditFormSettings UserControlPath="~/includes/userControls/MenuForm.ascx" EditFormType="WebUserControl">
    </EditFormSettings>
    <ClientSettings AllowItemsDragDrop="true">
        <Selecting AllowItemSelection="True" />
    </ClientSettings>
</telerik:RadTreeList>

Code Behind:

private string[] DataKey = { "MenuID" };
private string[] ParentKey = { "ParentID" };
private List<SiteMenu> MenuList = new List<SiteMenu>();
 
protected override void OnInit(EventArgs e)
{
    base.OnInit(e);
    MenuManager.Skin = "Default";
    MenuManager.AllowPaging = false;
    MenuManager.AutoGenerateColumns = false;
    MenuManager.GridLines = TreeListGridLines.Both;
    MenuManager.ShowTreeLines = false;
    MenuManager.NeedDataSource += MenuManager_NeedDataSource;
    MenuManager.InsertCommand += MenuManager_InsertCommand;
    MenuManager.UpdateCommand += MenuManager_UpdateCommand;
    MenuManager.DeleteCommand += MenuManager_DeleteCommand;
    MenuManager.ItemDataBound += MenuManager_ItemDataBound;
    MenuManager.ItemCommand += MenuManager_ItemCommand;
    MenuManager.ClientSettings.AllowItemsDragDrop = true;
    MenuManager.ClientSettings.Selecting.AllowItemSelection = true;
    MenuManager.AllowMultiItemSelection = true;
    MenuManager.DataKeyNames = DataKey;
    MenuManager.ParentDataKeyNames = ParentKey;
    MenuManager.ItemDrop += MenuManager_RowDrop;
 
    MenuList = new SiteMenu().SelectAllPublicMenuItemsBySiteIDNotDeleted(ThisSiteID);
}
 
protected override void OnLoad(EventArgs e)
{
    base.OnLoad(e);
    if (!IsPostBack)
    {
        MenuManager.ExpandToLevel(1);
    }
}
 
protected void MenuManager_NeedDataSource(object sender, TreeListNeedDataSourceEventArgs e)
{
    MenuManager.DataSource = MenuList;
}
 
protected void MenuManager_ItemCommand(object sender, TreeListCommandEventArgs e)
{
    if (e.CommandName == RadTreeList.InitInsertCommandName)
    {
        MenuManager.ClientSettings.Reordering.AllowColumnsReorder = false;
    }
    if (e.CommandName == RadTreeList.CancelCommandName)
    {
        MenuManager.ClientSettings.Reordering.AllowColumnsReorder = true;
    }
}
 
protected void MenuManager_ItemDataBound(object sender, TreeListItemDataBoundEventArgs e)
{
   //irrelevant
}
 
protected void MenuManager_InsertCommand(object sender, TreeListCommandEventArgs e)
{
    TreeListEditFormItem item = e.Item as TreeListEditFormItem;
    UserControl MenuForm = (UserControl)e.Item.FindControl(TreeListEditFormItem.EditFormUserControlID);
 
    int parentID = (int)item.ParentItem.GetDataKeyValue("MenuID");
 
    RadComboBox menuType = (RadComboBox)MenuForm.FindControl("MenuSelectList");
    RadTextBox menuText = (RadTextBox)MenuForm.FindControl("MenuText");
    switch (menuType.SelectedItem.Text)
    {
        case "Editable Content":
            RadTextBox pageTitle = (RadTextBox)MenuForm.FindControl("PageTitle");
            CheckBox defaultHomepage = (CheckBox)MenuForm.FindControl("DefaultHomepage");
            if (new SiteMenu().InsertNewMenuItem(parentID, menuText.Text, pageTitle.Text, defaultHomepage.Checked))
            {
                Response.Redirect("/admin/menuManager/");
            }
            break;
        case "Document Link":
            UploadedFile uploadedFile = null;
            RadUpload docUpload = (RadUpload)MenuForm.FindControl("DocumentLink");
            if (docUpload.UploadedFiles.Count > 0)
            {
                uploadedFile = docUpload.UploadedFiles[0];
            }
            if (new SiteMenu().InsertNewDocumentLink(parentID, menuText.Text, uploadedFile.GetName()))
            {
                Response.Redirect("/admin/menuManager/");
            }
            break;
        case "External / Custom Link":
            RadTextBox linkUrl = (RadTextBox)MenuForm.FindControl("LinkUrl");
            RadComboBox target = (RadComboBox)MenuForm.FindControl("LinkTarget");
            if (new SiteMenu().InsertExternalLink(parentID, menuText.Text, linkUrl.Text, target.Text))
            {
                Response.Redirect("/admin/menuManager/");
            }
            break;
        case "Chamber Modules":
            RadComboBox moduleType = (RadComboBox)MenuForm.FindControl("ModulePageType");
            if (new SiteMenu().InsertNewModuleMenuItem(parentID, menuText.Text, moduleType.SelectedValue))
            {
                Response.Redirect("/admin/menuManager/");
            }
            break;
    }
}
 
protected void MenuManager_UpdateCommand(object sender, TreeListCommandEventArgs e)
{
      //irrelevant
}
 
protected void MenuManager_DeleteCommand(object sender, TreeListCommandEventArgs e)
{
      //irrelevant
}
 
protected void MenuManager_RowDrop(object sender, TreeListItemDragDropEventArgs e)
{
    int key = (int)e.DraggedItems[0].GetDataKeyValue("MenuID");
 
    int destinationId = 0;
    int sortOrder = 0;
 
    if (IsUnder.Checked)
    {
        destinationId = (int)e.DestinationDataItem.GetDataKeyValue("MenuID");
        sortOrder = 1;
    }
    else
    {
        destinationId = (int)e.DestinationDataItem.GetParentDataKeyValue("ParentID");
        sortOrder = new SiteMenu().SelectThisMenuItem((int)e.DestinationDataItem.GetDataKeyValue("MenuID"), ThisSiteID).SortOrder + 1;
    }
 
    if (destinationId == 0)
    {
        if (key != destinationId)
        {
            MenuList.FirstOrDefault(i => i.MenuID == key).ParentID = destinationId;
            MenuList.FirstOrDefault(i => i.MenuID == key).SortOrder = sortOrder;
 
            foreach (SiteMenu menuItem in MenuList.Where(i => i.ParentID == destinationId))
            {
                if (menuItem.SortOrder >= sortOrder && menuItem.MenuID != key)
                {
                    menuItem.SortOrder += 1;
                }
            }
 
            if (new SiteMenu().UpdateMenuListByParentID(destinationId, MenuList.Where(i => i.ParentID == destinationId).ToList()))
            {
                Response.Redirect("/admin/menuManager/");
            }
        }
    }
    else
    {
        if (key != destinationId && key != MenuList.FirstOrDefault(i => i.MenuID == destinationId).ParentID)
        {
            MenuList.FirstOrDefault(i => i.MenuID == key).ParentID = destinationId;
            MenuList.FirstOrDefault(i => i.MenuID == key).SortOrder = sortOrder;
 
            foreach (SiteMenu menuItem in MenuList.Where(i => i.ParentID == destinationId))
            {
                if (menuItem.SortOrder >= sortOrder && menuItem.MenuID != key)
                {
                    menuItem.SortOrder += 1;
                }
            }
 
            if (new SiteMenu().UpdateMenuListByParentID(destinationId, MenuList.Where(i => i.ParentID == destinationId).ToList()))
            {
                Response.Redirect("/admin/menuManager/");
            }
        }
    }
}

2 Answers, 1 is accepted

Sort by
0
Accepted
Tsvetina
Telerik team
answered on 25 Sep 2012, 06:48 AM
Hello Kevin,

I tried using your code to reproduce the issue on my side but to no avail. Can you please give my sample a try and let me know if I am missing anything important out? I replaced the actual insert logic with calls to Response.Write, so you can easily see which event was fired.

Greetings,
Tsvetina
the Telerik team
If you want to get updates on new releases, tips and tricks and sneak peeks at our product labs directly from the developers working on the RadControls for ASP.NET AJAX, subscribe to their blog feed now.
0
Kevin
Top achievements
Rank 1
answered on 28 Sep 2012, 04:36 AM
Thanks, Ironically it was user error.  I forgot to enable view state.  I didn't think this was a problem because all of my menus were there and I was able to update and insert new rows and delete and everything worked.  However apparently the view state not being enabled was blocking the format from firing the insert on an item that didn't exist.  I would have expected it to stop all inserts and give blank screens on post back.  Ah well.   Thank you for your help.  It allowed me to troubleshoot a known good until I could determine my mistake.
Tags
TreeList
Asked by
Kevin
Top achievements
Rank 1
Answers by
Tsvetina
Telerik team
Kevin
Top achievements
Rank 1
Share this question
or