Должен ли DropDownList в CompositeControl запоминать выбранный элемент? - PullRequest
4 голосов
/ 06 июля 2010

Учитывая следующее

public class MyControl : CompositeControl
{
    private DropDownList myList;

    protected override void CreateChildControls()
    {
        base.CreateChildControls();

        myList = new DropDownList();
        myList.AutoPostBack = true;
        this.Controls.Add(myList);
        if (!Page.IsPostBack)
        {
            myList.DataSource = MyBLL.SomeCollectionOfItems;
            myList.DataBind();
        }
    }
}

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

Должен ли последний выбранный элемент автоматически сохраняться в ViewState автоматически или я ожидаю слишком много?

Ответы [ 2 ]

2 голосов
/ 30 июля 2010

Я думаю, что это скрытая проблема ViewState. Вы создаете и связываете элемент управления в CreateChildControls. Вы должны только создать контроль в этом месте. Переместите код привязки в событие загрузки классов и используйте EnsureChildControls.

0 голосов
/ 23 марта 2011

Вот решение, которое лучше всего рекомендуется. Он заключается в правильном понимании жизненного цикла страницы !! Элементы управления обратной передачей, такие как раскрывающийся список, восстанавливают свое опубликованное состояние (выбранный элемент опубликованного раскрывающегося списка). Он забывает выбранное значение, потому что вы перепривязываете его в событии Page_Load, которое происходит после загрузки выпадающего списка с опубликованным значением (поскольку состояние просмотра загружается после события Page_Init и до события Page_Load). И в этой привязке в событии Page_Load раскрывающийся список забывает свой восстановленный выбранный элемент. Лучшее решение - выполнить привязку данных в событии Page_Init вместо события Page_Load.

Сделайте что-то вроде ниже ...

Предположим, имя выпадающего списка - lstStates.

protected void Page_Init(object sender, EventArgs e) 
{   
   lstStates.DataSource = QueryDatabase(); //Just an example.  
   lstStates.DataTextField = "StateName";       
   lstStates.DataValueField = "StateCode";    
   lstStates.DataBind(); 
}

ASP.NET загружает состояние просмотра элемента управления после события Page_Init и до события Page_Load, так что selectedIndex выпадающего списка не будет затронут, и вы получите волшебные результаты волшебным образом !!

...