эффективный способ привязки вложенного репитера 3 уровня в глубину

У меня есть 3 уровня глубоких ретиров, которые связаны со следующим:

MainCategories – привязка к верхнему репитеру

SubCategories – привязка к повторителю на 2-м уровне

SubSubCategories – привязка к ретранслятору на 3-м уровне

До сих пор я получал привязку данных с помощью события itemdatabound ретрансляторов и передачи идентификатора категории для фильтрации уровня ниже (например: получить все подкатегории для MainCategory 1, получить все подкатегории для MainCategory2). Это, конечно, приводит к многочисленным поездкам в базу данных и неэффективно.

Есть ли способ сделать только 3 запроса: 1. получить все основные категории и привязать к верхнему rpeater, 2. получить все подкатегории и привязать как-то к повторителям 2-го уровня. 3. получить все подпункты и привязать к ретрансляторам третьего уровня.

Как это можно получить в asp.net c #?

Для этого выполните следующие шаги:

Прежде всего данные в DataTable говорят dataTableMainCategories а затем фильтруют SubCategories и SubSubCategories из dataTableMainCategories данных dataTableMainCategories . Наконец, в ItemDataBound напишите ниже блок кода, а для SubCategories и SubSubCategories DataTable добавьте нужный столбец перед импортом фильтрованных строк.

Заполните все основные категории в таблицу и привяжите к репитеру MainCategory ( rptrMainCategories ) и заполните все подпункты и подкатегории в dataTableCategories данных dataTableCategories .

 protected void rptrMainCategories_ItemDataBound(object sender, RepeaterItemEventArgs e) { if(e.Item.ItemType== ListItemType.Item) { int subCategoryID = 5; // Pass your subcategory id to be filtered Repeater rptrSubCategories = (Repeater)e.Item.FindControl("rptrSubCategories"); DataTable dtSubCategory = new DataTable(); dtSubCategory.Columns.Add(); // Add your columns as SubCatagory DataRow[] dataRows = dataTableCategories.Select("SubCategoryID= " + subCategoryID + ""); foreach (DataRow dataRow in dataRows) { dtSubCategory.ImportRow(dataRow); } rptrSubCategories.DataSource = dtSubCategory; rptrSubCategories.DataBind(); } } protected void rptrSubCategories_ItemDataBound(object sender, RepeaterItemEventArgs e) { if(e.Item.ItemType== ListItemType.Item) { int subSubCategoryID = 55; // Pass your subsubcategory id to be filtered Repeater rptrSubSubCategory = (Repeater)e.Item.FindControl("rptrSubSubCategory"); DataTable dtSubSubCategory = new DataTable(); dtSubSubCategory.Columns.Add(); // Add your columns as SubCatagory DataRow[] dataRows = dataTableCategories.Select("SubSubCategoryID= " + subSubCategoryID + ""); foreach (DataRow dataRow in dataRows) { dtSubSubCategory.ImportRow(dataRow); } rptrSubSubCategory.DataSource = dtSubSubCategory; rptrSubSubCategory.DataBind(); } } 

Обновить

Если вы используете типизированные (настраиваемые) данные, вы можете выбрать данные ниже:

 //Populate all main categories public List MainCategories { get; set; } //Populate all sub and sub categories public List SubCategories { get; set; } 

В событии rptrMainCategories_ItemDataBound напишите ниже код и привяжите к ретранслятору:

 List subCategory = SubCategories.Where(c => c.SubCategoryId = yourSubCategoryID); rptrSubCategories.DataSource = subCategory ; rptrSubCategories.DataBind(); 

На событии rptrSubCategories_ItemDataBound напишите ниже код и привяжите к ретранслятору:

 List subSubCategory = SubCategories.Where(c => c.SubSubCategoryId = yourSubSubCategoryID); rptrSubSubCategory.DataSource = subSubCategory ; rptrSubSubCategory.DataBind();