2013-05-08 6 views
0

Так что у меня почти такая работа. Я создаю Dynamic ListBoxes на основе выбора пользователя. Всегда, когда пользователь загружает страницу в первый раз, будет только один ListBox с показанными категориями верхнего уровня (те, у которых нет родителя). У меня есть категории с подкатегориями. Это может быть много подкатегорий, как такasp.net Воспроизведение динамически добавленных элементов управления ListBox на PostBack

Cat 1

Cat 2

  • Cat 2,1

  • Cat 2.2

    -- Cat 2.2.1 
    
         --- Cat 2.2.1.1 
    

и так далее.

Проблема, с которой я столкнулась, - это очистить список, если пользователь выбирает значение из уже показанного списка. Поэтому, если отображается 4 списка, и пользователь выбирает новое значение из первого списка, которое показывает, что верхние категории слез без родителя, все списки должны исчезнуть, а новый должен появиться. Если есть 4 списка, и пользователь нажимает на новый элемент в ListbOx 3, то 4-й должен повторно передать подкатегории выбранному родительскому элементу. Надеюсь, я правильно объясню.

Вот мой код до сих пор: общественных частичный класс WebForm2: System.Web.UI.Page { частное Int32 controlCount = 0; Панель _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) 
    { 

     if (!IsPostBack) 
     { 
      int cc = controlCount; 

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

      CreateDynamicControlGroup(true); 

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

      lb.DataSource = dt; 
      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) 
     { 
      CreateDynamicControlGroup(true); 

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

      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; 
     } 
    } 
} 

Вот моя разметка:

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server"> 

<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

Что о добавлении

int index = PanelPlaceholder.Controls.IndexOf((ListBox)sender); 
for (int i = index + 1; i < PanelPlaceholder.Controls.Count; i++) 
    PanelPlaceholder.Controls.RemoveAt(index + 1); 

в начале вашего метода ListBox_SelectedIndexChanged?

+0

Завершить с небольшими корректировками, похоже, работает. Эта проблема с вашим фрагментом заключается в том, что существуют другие списки с более высоким индексом, после того, как вы удалите их, а индекс будет отсутствовать. –

+0

Я отредактировал ответ. – filipko

0
int index = PanelPlaceholder.Controls.IndexOf((ListBox)sender); 
for (int i = PanelPlaceholder.Controls.Count - 1; i > index; i--) 
{ 
    PanelPlaceholder.Controls.RemoveAt(i); 
    controlCount--; 
} 
Смежные вопросы