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

3 posts, 1 answers
  1. Kevin
    Kevin avatar
    28 posts
    Member since:
    Dec 2008

    Posted 20 Sep 2012 Link to this post

    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. Answer
    Tsvetina
    Admin
    Tsvetina avatar
    1876 posts

    Posted 25 Sep 2012 Link to this post

    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.
  3. UI for ASP.NET Ajax is Ready for VS 2017
  4. Kevin
    Kevin avatar
    28 posts
    Member since:
    Dec 2008

    Posted 27 Sep 2012 Link to this post

    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.
Back to Top