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

Adding sub-menu context items using web service or another method

1 Answer 84 Views
Menu
This is a migrated thread and some comments may be shown as answers.
Joey
Top achievements
Rank 1
Joey asked on 17 Sep 2009, 09:13 AM
I've got my code below setup and its running, however its always adding the items returned by the web service to the root of the menu. This is a context menu so the options will change for each row in the grid its associated with using data from a database. How do I code it so that the items returned from the web service are added to an existing menu option? For example I want context specific options added under the IIS->Re-start menu as sub-items.

 

 

 

<telerik:RadCodeBlock ID="script1" runat="server">

 

 

 

 

 

 

<script language="javascript" type="text/javascript">

 

 

 

 

 

 

var _serverName,

 

_serverGuid =

"",

 

_rowElement,

_masterTable;

 

var _callCount = 1;

 

 

function GetRowDetails(sender, args) {

 

_masterTable = sender.get_masterTableView();

 

if (_masterTable != null) {

 

 

var row = _masterTable.get_dataItems()[args.get_itemIndexHierarchical()];

 

_rowElement = row.get_element();

 

var cell = _masterTable.getCellByColumnUniqueName(row, "Name");

 

_serverName = cell.innerHTML.toLowerCase().replace(

"<nobr>", "").replace("</nobr>", "");

 

cell = _masterTable.getCellByColumnUniqueName(row,

"ServerGuid");

 

_serverGuid = cell.innerHTML;

}

}

 

function SelectCurrentRow() {

 

_masterTable.selectItem(_rowElement);

}

function RowContextMenu(sender, eventArgs) {

 

}

 

function OnClientItemClicking(sender, eventArgs) {

 

 

}

 

 

function OnClientShowingHandler(sender, eventArgs) {

 

}

 

function onClientItemPopulating(sender, eventArgs) {

 

 

}

 

 

function webServiceLoadingSuccess(sender, eventArgs) {

 

 

var result = eventArgs.get_data();

 

 

var menu = $find("<%= GridMenu.ClientID %>");

 

 

var item = eventArgs.get_context();

 

 

var items = item.get_items();

 

 

if (menu.get_persistLoadOnDemandItems()) {

 

menu.trackChanges();

}

 

 

var childItems = items; //menu.get_items();

 

 

 

 

 

 

for (i = 0; i < result.length; i++) {

 

 

var itemData = result[i];

 

 

var dynamicItem = new Telerik.Web.UI.RadMenuItem();

 

dynamicItem._loadFromDictionary(itemData);

 

if (dynamicItem.get_navigateUrl() == "") {

 

dynamicItem.set_navigateUrl(

"#");

 

}

childItems.add(dynamicItem);

}

 

if (menu.get_persistLoadOnDemandItems()) {

 

menu.commitChanges();

}

}

 

function OnClientShowingHandler(sender) {

 

_callCount = 0;

}

 

function OnClientItemOpening(sender) {

 

 

var menu = sender;

 

 

if (!menu._itemsLoaded) {

 

 

var webServiceSettings = new Telerik.Web.UI.WebServiceSettings({})

 

webServiceSettings.set_path(

"WebServices/GlobalService.asmx");

 

webServiceSettings.set_method(

"GetServerApplications");

 

 

var webServiceLoader = new Telerik.Web.UI.WebServiceLoader(webServiceSettings);

 

webServiceLoader.add_loadingSuccess(webServiceLoadingSuccess);

 

var text = "";

 

 

var value = "";

 

 

if (menu.get_focusedItem() != null) {

 

text = menu.get_focusedItem().get_text();

value = menu.get_focusedItem().get_value();

}

 

var itemData = { Text: text, Value: value };

 

 

var contextData = { ServerGuid: _serverGuid };

 

 

var params = { item: itemData, context: contextData };

 

 

//jQuery("#DebugOutput").html("ServerGuid: " + _serverGuid + " " + _callCount);

 

 

 

 

 

webServiceLoader.loadData(params, menu)

menu._itemsLoaded =

true;

 

}

_callCount++;

}

 

</script>

 

 

 

 

 

 

</telerik:RadCodeBlock>

 

<telerik:RadContextMenu runat="server" ID="GridMenu" ExpandDelay="50" OnItemClick="GridMenu_ItemClick"

 

 

 

OnClientItemClicking="OnClientItemClicking" OnClientShowing="OnClientShowingHandler"

 

 

 

OnClientItemPopulating="onClientItemPopulating" OnClientItemOpening="OnClientItemOpening"

 

 

 

OnLoad="GridMenu_Load">

 

 

 

<WebServiceSettings Method="GetServerApplications" Path="~/WebServices/GlobalService.asmx" />

 

 

 

<Targets>

 

 

 

<telerik:ContextMenuControlTarget ControlID="ServerGrid" />

 

 

 

</Targets>

 

 

 

<Items>

 

 

 

<telerik:RadMenuItem Text="Reboot" ExpandMode="ClientSide" />

 

 

 

<telerik:RadMenuItem IsSeparator="true" Value="Sep1" />

 

 

 

<telerik:RadMenuItem Text="IIS">

 

 

 

<Items>

 

 

 

<telerik:RadMenuItem Text="Re-start" Value="IIS" ExpandMode="WebService" />

 

 

 

<telerik:RadMenuItem IsSeparator="true" Value="Sep2" />

 

 

 

<telerik:RadMenuItem Text="Start" Value="IIS" ExpandMode="WebService" />

 

 

 

<telerik:RadMenuItem Text="Stop" Value="IIS" ExpandMode="WebService" />

 

 

 

</Items>

 

 

 

</telerik:RadMenuItem>

 

 

 

<telerik:RadMenuItem Text="Services">

 

 

 

<Items>

 

 

 

<telerik:RadMenuItem Text="Re-start" Value="Services" ExpandMode="WebService" />

 

 

 

<telerik:RadMenuItem IsSeparator="true" Value="Sep3" />

 

 

 

<telerik:RadMenuItem Text="Start" Value="Services" ExpandMode="WebService" />

 

 

 

<telerik:RadMenuItem Text="Stop" Value="Services" ExpandMode="WebService" />

 

 

 

</Items>

 

 

 

</telerik:RadMenuItem>

 

 

 

</Items>

 

 

 

</telerik:RadContextMenu>

 

 

1 Answer, 1 is accepted

Sort by
0
T. Tsonev
Telerik team
answered on 22 Sep 2009, 04:28 PM
Hello Joey,

If I understand your scenario correctly you can use the built-in load-on-demand of RadMenu instead of calling the web service directly. You can use the itemPopulating event to load the items for the current row by using the context property, as demonstrated in this example:
http://demos.telerik.com/aspnet-ajax/menu/examples/programming/webservice/defaultcs.aspx

You only need to make sure that the items are cleared, so they can be loaded again for the next row, as described in this forum thread:
http://www.telerik.com/community/forums/aspnet-ajax/menu/prevent-expandmode-webservice-nodes-from-being-cached.aspx#636445

Greetings,
Tsvetomir Tsonev
the Telerik team

Instantly find answers to your questions on the new Telerik Support Portal.
Watch a video on how to optimize your support resource searches and check out more tips on the blogs.
Tags
Menu
Asked by
Joey
Top achievements
Rank 1
Answers by
T. Tsonev
Telerik team
Share this question
or