Динамически загруженный пользовательский веб-элемент управления скрывается при обратной передаче

2

У меня есть веб-пользовательский контроль

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="WebUserControl1.ascx.cs"
    Inherits="WebApplication5.WebUserControl1" %>
<asp:DropDownList ID="ddlnew" AutoPostBack="true" runat="server" 
    onselectedindexchanged="ddlnew_SelectedIndexChanged">
    <asp:ListItem Text="text1" />
    <asp:ListItem Text="text1" />
    <asp:ListItem Text="text2" />
    <asp:ListItem Text="text1" />
    <asp:ListItem Text="text2" />
    <asp:ListItem Text="text2" />
</asp:DropDownList>

и на странице Default.aspx

<asp:Button Text="PostBack" ID="btnPost" runat="server" 
onclick="btnPost_Click" />

и на Default.aspx.cs

    protected void btnPost_Click(object sender, EventArgs e)
    {
        WebUserControl1 uc =  (WebUserControl1)Page.LoadControl("~/WebUserControl1.ascx");
        PlaceHolder.Controls.Add(uc);
    }

и когда мы выберем любой элемент из раскрывающегося списка, он будет возвращен обратно, а элемент управления скроется со страницы

пожалуйста, помогите, как можно предотвратить скрытие

спасибо

Теги:
user-controls
updatepanel

4 ответа

4

Динамически создаваемые элементы управления must be recreated on every postback, когда вы понимаете, что каждый postback создает новый экземпляр класса Page, и в этом случае вы должны каждый раз создавать все элементы управления, это становится более очевидным.

Вот хорошая статья об этом

Еще одно сообщение об этом, на которое я ответил

И еще

Чтобы сохранить состояние между postbacks, вы можете использовать ViewState или ControlState

Состояние контроля MSDN и пример состояния просмотра

  • 0
    Как мне сохранить данные, которые я ввел до контрольного постбэка?
  • 0
    Используйте ViewState или ControlState - msdn.microsoft.com/en-us/library/1whwt1k7(v=VS.80).aspx
Показать ещё 4 комментария
2
protected void ddlnew_SelectedIndexChanged(object o, EventArgs e)
{
  ViewState["ddlnew_value"]=ddlnew.selectdeitem; 
}

чем на странице load pu this

If(IsPostBack)
{
    if(ViewState["ddlnew_value"]!=null)
    {
        ddlnew.selecteditem=ViewState["ddlnew_value"];
    }
 }

это должно работать

1

В ASP.NET динамически загруженные элементы управления требуют небольшого внимания из-за их поведения через обратную передачу. Вы должны поддерживать ViewState для динамических элементов управления по обратной стороне или check that on which control is generating postback you will load the control or not..

Проверьте эти статьи (Специальная ссылка MSDN):
Обширная проверка пользовательских элементов управления - MSDN
Загрузка динамического пользователя UserControl в UpdatePanel
Поддерживать Viewstate для динамических элементов управления через обратную передачу

0

1) Вам нужно включить режим просмотра на странице.

2) Как и другие в этом сообщении, вам нужно воссоздать динамически загруженный пользовательский элемент управления.

Вот пример:

protected void Page_Load(object sender, EventArgs e)
{
    Render();
}

Метод рендеринга:

private void Render()
{
    var list = Helpers.Content.Lists.GetListByTitle();
    if (list != null && list.Items.Count > 0)
    {
        this.divContainer.Controls.Clear();
        var i = 1;
        list.Items.ForEach(question =>
                               {
                                   this.divContainer.Controls.Add(RenderQuestion(question, i));
                                   i++;
                               });
    }
}

Render Question Method:

    private Control RenderQuestion(Entities.Modules.Item question, int count)
    {
        // Create question control
        var q = (Custom.Widgets.ActionPlans.New.Question)LoadControl("~/Custom/Widgets/ActionPlans/New/Question.ascx");

        // Render question
        q.Render(question, count);
        return q;
    }

Надеюсь, что это поможет.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню