RadMenu скрыть подменю

Я использую Радмену. Мне нравится скрывать элемент подменю.

Меню выглядит следующим образом. Обратите внимание, что Car - это главное меню, а Dodge, Toyota и Honda - это подменю.

Автомобили - Додж - Тойота - Хонда

Я пытаюсь сделать что-то вроде следующего, но не сработает:

     protected void RadMenu1_ItemCreated(object sender, Telerik.Web.UI.RadMenuEventArgs e)
     {
      if (e.Item is RadMenuItem)
       {

        if (e.Item.Parent != null && e.Item.Parent is RadMenuItem)
        {
            if (e.Item.Menu.FindItemByText("Honda"))
            {
                e.Item.Visible = false;
            }
        }
    }
}

2 ответа

Решение

Пожалуйста, попробуйте с приведенным ниже фрагментом кода и дайте мне знать, если какие-либо проблемы.

ASPX

<div>
    <telerik:RadScriptManager ID="RadScriptManager1" runat="server"></telerik:RadScriptManager>
    <telerik:RadMenu ID="RadMenu1" runat="server"  OnPreRender="RadMenu1_PreRender">
        <Items>
            <telerik:RadMenuItem Text="cars">
                <Items>
                    <telerik:RadMenuItem Text="Honda"></telerik:RadMenuItem>
                    <telerik:RadMenuItem Text="Toyota"></telerik:RadMenuItem>
                </Items>
            </telerik:RadMenuItem>
        </Items>
    </telerik:RadMenu>
</div>

ASPX.CS

protected void RadMenu1_PreRender(object sender, EventArgs e)
{
    foreach (RadMenuItem item in (sender as RadMenu).Items)
    {
        if (item.Items.Count > 0)
        {
            foreach (RadMenuItem citem in item.Items)
            {   
                if (citem.Text != "Honda")
                {
                    citem.Visible = false;
                }
            }
        }
    }
}

// Hide top menu cars
protected void RadMenu1_PreRender(object sender, EventArgs e)
{
foreach (RadMenuItem item in (sender as RadMenu).Items)
{
    if (item.Items.Count > 0)
    {
        if(item.Text == "cars")
        {
          item.Visible = false;
        }
        foreach (RadMenuItem citem in item.Items)
        {   
            if (citem.Text != "Honda")
            {
                citem.Visible = false;
            }
        }
    }
}
}

Мне восемь лет, но у меня есть немного другое решение, основанное на решении, предоставленном @Jayesh. На странице ASPX вообще ничего нет, поскольку событие обрабатывается в Page_Load.

ASPX.CS:

      protected void Page_Load(object sender, EventArgs e)
{
    if(Page.IsPostBack)
    {
        return;
    }
    Telerik.Web.UI.RadMenu topLevel = RadMenu1;
    foreach(RadMenuItem item in topLevel.Items)
    {
        LookForRadMenuItems(item);
    }
}

private void LookForRadMenuItems(RadMenuItem sender)
{
    if(sender.Text == "Honda")
    {
        sender.Visible = false;
    }
    foreach(RadMenuItem item in sender.items)
    {
        LookForRadMenuItems(item);
    }
}

Это позволит найти все экземпляры «Honda» во всех меню и подменю и скрыть их. Вы можете сделать его более гибким, проверив, является ли текст.containsВместо этого «Honda», например, или создание словаря или хеш-таблицы для поиска более чем одного элемента одновременно.

Мое конкретное приложение на самом деле создано на VB.NET, поэтому вот его эквивалент:

ВБ.НЕТ

      Protected Sub Page_Load(sender As Object, e As System.EventArgs)
    If Page.IsPostBack Then Exit Sub
    Dim topLevel As Telerik.Web.UI.RadMenu = RadMenu1
    For Each item As RadMenuItem In topLevel.Items
        LookForRadMenuItems(item)
    Next
End Sub

Private Sub LookForRadMenuItems(sender as RadMenuItem)
    If sender.Text = "Honda" Then
        sender.Visible = false
    End If
    For Each(item As RadMenuItem In sender.Items)
        LookForRadMenuItems(item)
    Next
End Sub
Другие вопросы по тегам