Basically have a treeview that has a title as the first node and upon contextmenu selection you add a user control to the item template...
I'm assuming upon the e.menuitem.value on the case statement you would add that user control to the item template on that node but how do you add it dynamically?
thanks in advance.
I'm assuming upon the e.menuitem.value on the case statement you would add that user control to the item template on that node but how do you add it dynamically?
thanks in advance.
3 Answers, 1 is accepted
0
Lee
Top achievements
Rank 1
answered on 17 Aug 2010, 09:40 PM
ok i've got to add my usercontrol to the node but two things occur. one. the node doesn't pick up the correct context menu on the usercontrol node. two. when I try to add a second instance of the same control it replaces the control with text. here is code below.
code behind only adds simple user control of textbox for now as i'll add radcombobox etc as i move forward.
<%@ Page Language="vb" AutoEventWireup="false" CodeBehind="AddChecklist.aspx.vb" Inherits="CheckList_Test.AddChecklist" %><%@ Register Assembly="Telerik.Web.UI" Namespace="Telerik.Web.UI" TagPrefix="telerik" %><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"><html xmlns="http://www.w3.org/1999/xhtml"><head runat="server"> <title></title></head><body> <form id="form1" runat="server"> <asp:ScriptManager ID="ScriptManager1" runat="server"> </asp:ScriptManager> <script type="text/javascript"> function SetHandleDock(dock, args) { dock.set_handle(document.getElementById("Handle_" + dock.get_id())); } //<!-- function onClientContextMenuShowing(sender, args) { var treeNode = args.get_node(); treeNode.set_selected(true); //enable/disable menu items setMenuItemsState(args.get_menu().get_items(), treeNode); } //this method disables the appropriate context menu items function setMenuItemsState(menuItems, treeNode) { for (var i = 0; i < menuItems.get_count(); i++) { var menuItem = menuItems.getItem(i); switch (menuItem.get_value()) { case "Copy": formatMenuItem(menuItem, treeNode, 'Copy "{0}"'); break; case "Rename": formatMenuItem(menuItem, treeNode, 'Rename "{0}"'); break; case "Delete": formatMenuItem(menuItem, treeNode, 'Delete "{0}"'); break; case "NewFolder": if (treeNode.get_parent() == treeNode.get_treeView()) { menuItem.set_enabled(false); } else { menuItem.set_enabled(true); } break; case "MarkAsRead": var enabled = hasNodeMails(treeNode); menuItem.set_enabled(enabled != null); break; } } } //formats the Text of the menu item function formatMenuItem(menuItem, treeNode, formatString) { var nodeValue = treeNode.get_value(); if (nodeValue && nodeValue.indexOf("_Private_") == 0) { menuItem.set_enabled(false); } else { menuItem.set_enabled(true); } var newText = String.format(formatString, extractTitleWithoutMails(treeNode)); menuItem.set_text(newText); } //checks if the text contains (digit) function hasNodeMails(treeNode) { return treeNode.get_text().match(/\([\d]+\)/ig); } //removes the brackets with the numbers,e.g. Inbox (30) function extractTitleWithoutMails(treeNode) { return treeNode.get_text().replace(/\s*\([\d]+\)\s*/ig, ""); } //--> </script> <div> <table> <tr> <td> <telerik:RadTreeView ID="RadTreeView1" runat="server" Width="500px" AllowNodeEditing="True" OnContextMenuItemClick="RadTreeView1_ContextMenuItemClick" OnClientContextMenuShowing="onClientContextMenuShowing" OnNodeEdit="RadTreeView1_NodeEdit"> <ContextMenus> <telerik:RadTreeViewContextMenu ID="Section"> <Items> <telerik:RadMenuItem Value="AddSection" Text="Add Section"> </telerik:RadMenuItem> </Items> <CollapseAnimation Type="none" /> </telerik:RadTreeViewContextMenu> <telerik:RadTreeViewContextMenu ID="Group"> <Items> <telerik:RadMenuItem Value="AddGroup" Text="Add Group"> </telerik:RadMenuItem> <telerik:RadMenuItem Value="EditSection" Text="Edit Section"> </telerik:RadMenuItem> <telerik:RadMenuItem Value="RemoveSection" Text="Remove Section"> </telerik:RadMenuItem> </Items> <CollapseAnimation Type="none" /> </telerik:RadTreeViewContextMenu> <telerik:RadTreeViewContextMenu ID="Question"> <Items> <telerik:RadMenuItem Value="AddQuestion" Text="Add Question"> </telerik:RadMenuItem> <telerik:RadMenuItem Value="RemoveGroup" Text="Edit Group"> </telerik:RadMenuItem> <telerik:RadMenuItem Value="RemoveQuestion" Text="Remove Group"> </telerik:RadMenuItem> </Items> <CollapseAnimation Type="none" /> </telerik:RadTreeViewContextMenu> <telerik:RadTreeViewContextMenu ID="LastQuestion"> <Items> <telerik:RadMenuItem Value="EditQuestion" Text="Edit Question"> </telerik:RadMenuItem> <telerik:RadMenuItem Value="RemoveQuestion" Text="Remove Question"> </telerik:RadMenuItem> </Items> <CollapseAnimation Type="none" /> </telerik:RadTreeViewContextMenu> </ContextMenus> </telerik:RadTreeView> </td> <td> </td> </tr> </table> </div> </form></body></html>code behind only adds simple user control of textbox for now as i'll add radcombobox etc as i move forward.
Imports Telerik.Web.UIImports System.Collections.GenericImports SystemImports System.CollectionsImports System.ComponentModelImports System.DataImports System.DrawingImports System.WebImports System.Web.SessionStateImports System.Web.UIImports System.Web.UI.WebControlsImports System.Web.UI.HtmlControlsPublic Class AddChecklist Inherits System.Web.UI.Page Private Enum enViews CheckList Section Group Question End Enum Protected Const unreadPattern As String = "\(\d+\)" Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Me.IsPostBack = False Then Dim tn As New RadTreeNode tn.Text = "New CheckList" tn.Value = 0 txtCheckListText.Text = "New CheckList" RadTreeView1.Nodes.Add(tn) End If For Each node As RadTreeNode In RadTreeView1.GetAllNodes() If (node.Level = 0) Then node.ContextMenuID = "Section" ElseIf (node.Level = 1) Then node.ContextMenuID = "Group" ElseIf (node.Level = 2) Then node.ContextMenuID = "Question" ElseIf (node.Level = 3) Then node.ContextMenuID = "LastQuestion" End If Next End Sub Protected Sub RadTreeView1_NodeEdit(ByVal sender As Object, ByVal e As Telerik.Web.UI.RadTreeNodeEditEventArgs) Handles RadTreeView1.NodeEdit e.Node.Text = e.Text End Sub Protected Sub RadTreeView1_ContextMenuItemClick(ByVal sender As Object, ByVal e As RadTreeViewContextMenuEventArgs) Dim clickedNode As RadTreeNode = e.Node Select Case e.MenuItem.Value Case "AddSection" Dim pnl1 As New Panel() Dim myControl As Control = LoadControl("~/uc/ucSection.ascx") Dim newNode As New RadTreeNode("New Section", clickedNode.Nodes.Count + 1) myControl.ID = "ucSection" pnl1.Controls.Add(myControl) newNode.Controls.Add(pnl1) newNode.Selected = True clickedNode.Nodes.Add(newNode) clickedNode.Expanded = True Exit Select Case "AddGroup" Dim newFolder As New RadTreeNode(String.Format("New Group", clickedNode.Nodes.Count + 1)) clickedNode.Nodes.Add(newFolder) clickedNode.Expanded = True Exit Select Case "AddQuestion" Dim newFolder As New RadTreeNode(String.Format("New Question", clickedNode.Nodes.Count + 1)) clickedNode.Nodes.Add(newFolder) clickedNode.Expanded = True Exit Select Case "RemoveSection" clickedNode.Remove() Exit Select Case "RemoveGroup" clickedNode.Remove() Exit Select Case "RemoveQuestion" clickedNode.Remove() Exit Select End Select End SubEnd Class0
Accepted
Hello Lee,
1. You rely in the Page_Load event to set the ContextMenuID property. However, when you add a new tree node, the page load event occurs before the ContextMenuItemClick event, so the ContextMenuID proerty is never set for the new node. You should assign the context menus like this:
2. Dynamically added controls have to be recreated after each postback. With this in mind, please try the following:
Regards,
Peter
the Telerik team
1. You rely in the Page_Load event to set the ContextMenuID property. However, when you add a new tree node, the page load event occurs before the ContextMenuItemClick event, so the ContextMenuID proerty is never set for the new node. You should assign the context menus like this:
Protected Sub RadTreeView1_ContextMenuItemClick(ByVal sender As Object, ByVal e As RadTreeViewContextMenuEventArgs) Dim clickedNode As RadTreeNode = e.Node Select Case e.MenuItem.Value Case "AddSection" Dim pnl1 As New Panel() Dim myControl As Control = LoadControl("ucSection.ascx") Dim newNode As New RadTreeNode("New Section", clickedNode.Nodes.Count + 1) myControl.ID = "ucSection" pnl1.Controls.Add(myControl) newNode.Controls.Add(pnl1) newNode.Selected = True newNode.ContextMenuID = "Group" clickedNode.Nodes.Add(newNode) clickedNode.Expanded = True2. Dynamically added controls have to be recreated after each postback. With this in mind, please try the following:
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load If Me.IsPostBack = False Then Dim tn As New RadTreeNode tn.Text = "New CheckList" tn.Value = 0 'txtCheckListText.Text = "New CheckList" RadTreeView1.Nodes.Add(tn) End If For Each node As RadTreeNode In RadTreeView1.GetAllNodes() If (node.Level = 0) Then node.ContextMenuID = "Section" ElseIf (node.Level = 1) Then node.ContextMenuID = "Group" Dim pnl1 As New Panel() Dim myControl As Control = LoadControl("ucSection.ascx") myControl.ID = "ucSection" pnl1.Controls.Add(myControl) node.Controls.Add(pnl1) Regards,
Peter
the Telerik team
Do you want to have your say when we set our development plans? Do you want to know when a feature you care about is added or when a bug fixed? Explore the Telerik Public Issue Tracking system and vote to affect the priority of the items
0
Lee
Top achievements
Rank 1
answered on 20 Aug 2010, 08:10 PM
perfect! Thanks!