2013-05-08 4 views
2

Я хочу создать динамически добавленный ListBoxes на основе основных категорий и подкатегорий, где они могут быть бесконечным количеством подкатегорий. Я работаю над этим всю неделю и не могу понять это.Asp.net Динамически воссоздавая ListBoxes на PostBack

Я хочу, чтобы это было как выбор категории Ebay. Когда страница загружается, появится список со всеми основными категориями. Когда пользователь выбирает элемент в списке, другой список следует добавлять динамически, так что в каждом списке есть выделенный элемент. Поэтому после того, как вы выбрали первый элемент в первом списке, должно быть два списка со вторым списком, показывающим все подкатегории, принадлежащие выбранному. Смотрите скриншот.

Ebay Category Selection Example http://www.aquariumbids.com/Images/ebayCat.JPG

КОД НА ЗАПРОС - Тесная работать я думаю.

public partial class WebForm2 : System.Web.UI.Page 
{ 
    private Int32 controlCount = 0; 
    Panel _panel; 

    private Panel PanelPlaceholder 
    { 
     get 
     { 
      if (_panel == null && Master != null) 
       _panel = pnlContainer; 
      return _panel; 
     } 
    } 

    protected void Page_PreInit(Object sender, EventArgs e) 
    { 
     this.EnsureChildControls(); 

     if (IsPostBack) 
     { 
      // Re-create controls but not from datasource 
      // The controlCount value is output in the page as a hidden field during PreRender. 
      controlCount = Int32.Parse(Request.Form["controlCount"]); // assigns control count from persistence medium (hidden field)   
      for (Int32 i = 0; i < controlCount; i++) 
      { 
       CreateDynamicControlGroup(false); 
      } 
     } 
    } 
    protected void Page_Load(Object sender, EventArgs e) 
    { 
     // create from data query. 
     // only if not postback 
     if (!IsPostBack) 
     { 
      int cc = controlCount; 

      DataTable dt = null;     
      Dictionary<string, string> Params = new Dictionary<string, string>(); 
      dt = Globals.g_DatabaseHandler.GetRecords(StoredProcedures.GetMainCategories, Params); 

      // create a set of dynamic controls for the Row, incrementing counter and 
      // getting a reference to the new controls via their common parent (Dynamic PlaceHolder) 
      CreateDynamicControlGroup(true); 

      ListBox lb = (ListBox)PanelPlaceholder.Controls[controlCount - 1]; 

      // On reload you will see that child ListItems are persisted by the DropDownList 
      lb.DataSource = dt; // use the same table 
      lb.DataValueField = "ID"; 
      lb.DataTextField = "Name"; 
      lb.DataBind(); 
     } 
    } 


    protected void Page_PreRender(Object sender, EventArgs e) 
    { 
     // persist control count 
     ClientScript.RegisterHiddenField("controlCount", controlCount.ToString()); 
    } 


    private void ListBox_SelectedIndexChanged(Object sender, EventArgs e) 
    { 
     ListBox lb = sender as ListBox; 


     Dictionary<string, string> Params = new Dictionary<string, string>(); 
     Params.Add("parentID", lb.SelectedValue); 
     DataTable Categories = Globals.g_DatabaseHandler.GetRecords(StoredProcedures.GetChildCategories, Params); 

     if (Categories.Rows.Count > 0) 
     { 
      // create a set of dynamic controls for the Row, incrementing counter and 
      // getting a reference to the new controls via their common parent (Dynamic PlaceHolder) 
      CreateDynamicControlGroup(true); 

      ListBox newLb = (ListBox)PanelPlaceholder.Controls[controlCount - 1]; 
      // On reload you will see that child ListItems are persisted by the DropDownList 
      newLb.DataSource = Categories; // use the same table 
      newLb.DataValueField = "ID"; 
      newLb.DataTextField = "Name"; 
      newLb.DataBind(); 
     } 
    } 


    private void CreateDynamicControlGroup(Boolean incrementCounter) 
    { 
     // Create one logical set of controls do not assign values! 
     ListBox lb = new ListBox(); 
     lb.AutoPostBack = true; 
     lb.CssClass = "panel"; 
     PanelPlaceholder.Controls.Add(lb); 

     // wire event delegate 
     lb.SelectedIndexChanged += new EventHandler(ListBox_SelectedIndexChanged); 

     if (incrementCounter) 
     { 
      controlCount += 1; 
     } 
    } 
} 

Markup:

<div class="Column12" id="Form_NewListing"> 
    <h2 class="h2row">Create Your Listing - Step 1 of 2)</h2> 
    <h3 class="h3row">Select a category</h3> 
    <div class="panel"> 
     <asp:Panel ID="pnlContainer" runat="server"></asp:Panel>   

    </div> 
</div> 
+0

Возможно, вы хотите разместить код. Мое предположение прямо сейчас, не видя ничего, заключается в том, что вы добавляете элементы управления, не проверяя, произошла ли обратная передача, но без кода ... – Chuck

+0

Done, OP updated –

+0

Он почти работает с вышеуказанным кодом. То, что я вижу, - это если я выбираю предыдущие ListBoxes, те, которые являются дочерними, не удаляют или не обновляют себя. –

ответ

0

Если вы хотите сделать это без постбэка, вот статья, которая может помочь: шаги, чтобы создать выпадающий список каскадный с помощью Microsoft ASP. NET AJAX framework http://support.microsoft.com/kb/976156

+0

Я хочу ListBoxes для каждой категории и всех подкатегорий, как показано на рисунке. –

Смежные вопросы