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

#asp.net

#asp.net

Вопрос:

У меня есть пользовательский элемент управления, который содержит два текстовых поля и два выпадающих списка. Я загружаю этот элемент управления в первый раз при page_load событии программно. После этого при каждом нажатии кнопки «Добавить новый» элементы управления добавляются динамически, но когда это происходит, ранее загруженные элементы управления показывают, что все серверные элементы управления (которые находятся внутри пользовательского элемента управления) пусты. Как я могу сохранить состояние этих элементов управления? Мой код пользовательского элемента управления такой, как показано ниже.

 <%@ Control Language="C#" AutoEventWireup="true" CodeFile="qualificationControl.ascx.cs" Inherits="qualificationControl" %>
<style type="text/css">

.RowHeight
{
    height: 30px;
}
</style>
<table width="100%">
    <tr>
        <td class="RowHeight" width="20%">
            Course Name</td>
        <td width="20%">
            <asp:DropDownList ID="courseList" runat="server" Width="100px">
            </asp:DropDownList>
        </td>
        <td width="20%">
            Year of Passing</td>
        <td width="*">
            <asp:DropDownList ID="yearList" runat="server" Width="100px">
                <asp:ListItem Value="0">2005</asp:ListItem>
                <asp:ListItem Value="1">2006</asp:ListItem>
                <asp:ListItem Value="2">2007</asp:ListItem>
                <asp:ListItem Value="3">2008</asp:ListItem>
                <asp:ListItem Value="4">2009</asp:ListItem>
            </asp:DropDownList>
        </td>
    </tr>
    <tr>
        <td class="RowHeight" width="20%">
            Percentage</td>
        <td colspan="3">
            <asp:TextBox ID="percentageBox" runat="server"></asp:TextBox>
        </td>
    </tr>
    <tr>
        <td class="RowHeight" width="20%">
            Instutitute Name</td>
        <td colspan="3">
            <asp:TextBox ID="InstiNameBox" runat="server" Width="350px"></asp:TextBox>
        </td>
    </tr>
</table>
  

и на странице aspx.cs, как показано ниже.

 using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Collections;

public partial class AppplicationForm2 : System.Web.UI.Page
{
    Control qualificationControl;
    UserControl usrqualificationControl = new UserControl();
    int CtrlID = 0;
    protected void Page_Load(object sender, EventArgs e)
    {
        qualificationControl = usrqualificationControl.LoadControl("~/control/qualificationControl.ascx");
        if (!IsPostBack)
        {
            ArrayList CtrlList = new ArrayList();
            qualificationControl.ID = CtrlID.ToString();
            UserCtrlHolder.Controls.Add(qualificationControl);
            CtrlList.Add(qualificationControl);
            Session.Add("qualiControl", CtrlList);
        }
        //else 
    }
    protected void addQualificationBtn_Click(object sender, EventArgs e)
    {
        ArrayList CtrlList = null;
        ArrayList CourseList = new ArrayList();
        ArrayList YearList = new ArrayList();
        ArrayList percentageList = new ArrayList();
        ArrayList InstituteList = new ArrayList();
        if (Session["qualiControl"] != null)
        {
            CtrlList = (ArrayList)Session["qualicontrol"];
        }
        qualificationControl.ID = CtrlList.Count.ToString();
        CtrlList.Add(qualificationControl);
        for (int i = 0; i < CtrlList.Count; i  )
        {
            UserCtrlHolder.Controls.Add((Control)CtrlList[i]);
        }
    }
    private void RestoreUserControl(ArrayList CourseList,ArrayList YearList,ArrayList PercentageList,ArrayList InstiNameList,ArrayList CtrlList)
    {
        for (int CtrlCnt = 0; CtrlCnt < CtrlList.Count - 1; CtrlCnt  )
        {
            Control userControl = (Control)UserCtrlHolder.FindControl(CtrlID.ToString());
            DropDownList dlCourseList = (DropDownList)userControl.FindControl("courseList");
            DropDownList dlYearList = (DropDownList)userControl.FindControl("yearList");
            TextBox percentageBox = (TextBox)userControl.FindControl("percentageBox");
            TextBox InstiNameBox = (TextBox)userControl.FindControl("InstiNameBox");

            dlCourseList.ClearSelection();
            dlYearList.ClearSelection();
            dlCourseList.Items.FindByText(CourseList[CtrlCnt].ToString()).Selected = true;
            dlYearList.Items.FindByText(CourseList[CtrlCnt].ToString()).Selected = true;
            percentageBox.Text = PercentageList[CtrlCnt].ToString();
            InstiNameBox.Text = PercentageList[CtrlCnt].ToString();
        }
    }

}
  

Ответ №1:

Использование Page_Init

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

Примечание : Если вы добавите динамические элементы управления детерминированно, все будет в порядке, но если у вас недетерминированная обработка, ваши элементы управления будут иметь разные идентификаторы в течение срока службы страницы, следовательно, состояние просмотра не будет загружаться при каждой обратной передаче. У вас не должно возникнуть никаких проблем с предоставленным вами кодом.

Комментарии:

1. @Chirag Fance: Если мой ответ помог вам, я предлагаю вам принять его как правильный ответ, чтобы другим было легче добраться до правильного ответа (и мы оба получим очки репутации; и вы получите 0% рейтинга принятия, что очень плохо, и люди начнут жаловаться на это).

Ответ №2:

http://www.google.com.tw/search?hl=enamp;safe=offamp;q=asp.net add control dynamicallyamp;aq=1amp;aqi=g10amp;aql=amp;oq=asp.net add control

существует множество статей о динамическом добавлении элементов управления, найдите тот, который вам подходит