Populating RadMenu Dynamically from Code Behind

945 Views Asked by At

I am trying to dynamically populate a Telerik Radmenu control in my code behind. I'm having a really hard time with it. I need to be able to bind my categories to my root elements and attributes to the child elements. I really am lost on this. If even someone has a suggestion of a better way to do this, even if it's with a different type of menu I would be very happy to try it out. Thanks in advance.

**EDIT my code has changed.

protected void createFilter(int categoryid)
{

    // check cateogyrid 

    //get list of proudct id
    List<int> productIds = new List<int>();
    DataRow[] productRow = CategoriesProductsData.Tables["Products"].Select("Category_ID = " + 573);

    productIds = productRow.Select(p => int.Parse(p["Product_ID"].ToString())).ToList();

    //get attributes
    ITCProductService pService = new TCProductServiceClient();
    var productTuples = (pService.GetProductsAttributes(productIds));

    List<Tuple<int, CustomAttribute>> customAttributes = new List<Tuple<int, CustomAttribute>>();
    foreach (var productTuple in productTuples)
    {
        foreach (var attributeTuple in productTuple.m_Item2)
        {
            var customAttribute = new Tuple<int, CustomAttribute>(productTuple.m_Item1, new CustomAttribute(attributeTuple));
            customAttributes.Add(customAttribute);
        }
    }

    List<CustomAttributeCategory> categories = new List<CustomAttributeCategory>();

    var categoryTuples = customAttributes.Select(a => a.Item2).Select(a => a.Attribute.Category).Distinct();
    foreach (var categoryTuple in categoryTuples)
    {
        var category = new CustomAttributeCategory(categoryTuple);
        var attributeByCategory = customAttributes.Select(a => a.Item2).Where(b => b.Attribute.CategoryId == categoryTuple.AttributeCategoryId).Distinct();
        foreach (var attributeTuple in attributeByCategory)
        {

            var attribute = new CustomAttribute(attributeTuple.Attribute);
            var attributeProductIds = customAttributes.Where(a => a.Item2.Attribute.AttributeId == attributeTuple.Attribute.AttributeId).Select(a => a.Item1).ToList();
            attribute.ProductIds = attributeProductIds;


            category.Attributes.Add(attribute);
        }
        categories.Add(category);



        foreach (var cat in categories)
        {                              
            var itemCategory = new RadMenuItem(cat.Category.Name.ToString());
            handsetMenu.Items.Add(itemCategory);

            var itemAttribute = new RadMenuItem(cat.Attributes.ToString());
            handsetMenu.Items.Add(itemAttribute);
        }          
    }
}

 <%--RAD MENU--%>
            <telerik:RadMenu ID="handsetMenu" runat="server" ShowToggleHandle="true">                                  
            </telerik:RadMenu> 
1

There are 1 best solutions below

2
On BEST ANSWER

I don't think ItemDataBound is the correct place to add child items.

Do you want to add the same child items under each of the root menu items?

Try doing it in the DataBound event (which fires after all itemDataBound events have completed) by iterating all RadMenu items.