Arhn - архитектура программирования

Поддержка динамически добавляемых элементов управления в ASP.net

Я застрял в том, как поддерживать состояние просмотра моих динамически добавленных пользовательских элементов управления в приложении Webforms. Я создал пользовательский элемент управления с именем Set.ascx:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="Set.ascx.cs" Inherits="CustomControlLab.Set" %>
&nbsp
<asp:Label ID="BodyArea" CssClass="SetLabel" runat="server" Text="Label"></asp:Label>
&nbsp
<asp:Label ID="Exercise" CssClass="SetLabel" runat="server" Text="Label"></asp:Label>
&nbsp
<asp:Label ID="SetNo" CssClass="SetLabel" runat="server" Text="Label"></asp:Label>
&nbsp
<asp:Label ID="Reps" CssClass="SetLabel" runat="server" Text="Label"></asp:Label>

Пользователь будет выбирать элементы из раскрывающихся списков, чтобы установить значение для каждой метки. Это устанавливается для события нажатия кнопки следующим образом:

    protected void AddExercise_Click(object sender, EventArgs e)
    {
            Set set = (Set)Page.LoadControl("Set.ascx");
            int currentSet = (int)ViewState["Sets"];
            set._bodyArea = AreaSelect.SelectedValue;
            set._exercise = ExerciseSelect.SelectedValue;
            set._reps = RepNumbers.SelectedValue;
            set._setNumber = currentSet.ToString();
            int idCount = (int)ViewState["Sets"];
            set.ID = string.Format("set{0}", idCount);
            currentSet++;
            ViewState["Sets"] = currentSet;
            WeightList.Controls.Add(set);
     }

Это правильно добавляет мой пользовательский элемент управления в список веса элемента управления на панели. Я не могу понять, как успешно воссоздать эти элементы управления в событии инициализации страницы? Я полагаю, это как-то связано с контрольным идентификатором? Или, возможно, мой подход никогда не сработает. Любая обратная связь будет действительно полезна !!

Следуя комментарию Тимса, я не уверен, как повторно загрузить UserCOntrol, используя идентификатор. Я пробовал это в событии Page_Load, если отправляю ответ:

      else
        {
            if(ViewState["Sets"] != null)
            {
            int sets = (int)ViewState["Sets"];
            for (int i = 0; i < sets; i++)
            {
                Set set = new Set();
                set = (Set)Page.FindControl(string.Format("MainContent_set{0}", i + 1));
                WeightList.Controls.Add(set);

            }
            }


        } 

но это не воссоздает объект Set. Глядя на страницу, когда она загружена, каждый Set UC отображает следующее:

&nbsp
<span id="MainContent_set1_BodyArea" class="SetLabel">All Exercises</span>
&nbsp
<span id="MainContent_set1_Exercise" class="SetLabel">Bench Press</span>
&nbsp
<span id="MainContent_set1_SetNo" class="SetLabel">1</span>
&nbsp
<span id="MainContent_set1_Reps" class="SetLabel">3</span>

Каждая метка на элементе управления имеет общедоступное свойство для установки его значения:

public partial class Set : System.Web.UI.UserControl
{
    public string _exercise { get { return Exercise.Text; } set { Exercise.Text = value; } }
    public string _bodyArea { get { return BodyArea.Text; } set { BodyArea.Text = value; } }
    public string _setNumber { get { return SetNo.Text; } set { SetNo.Text = value; } }
    public string _reps { get { return Reps.Text; } set { Reps.Text = value; } }

    protected void Page_Load(object sender, EventArgs e)
    {

    }
}

После того, что отображается на странице, я мог бы сделать следующее (что не работает !!)

      else
    {
        if(ViewState["Sets"] != null)
        {
        int sets = (int)ViewState["Sets"];
        for (int i = 0; i < sets; i++)
        {
            Set set = new Set();
            Label templbl = (Label)Page.FindControl(string.Format("MainContent_set{0}_BodyArea", i + 1));
            set._bodyArea = templbl.Text;
            //Other code to get rest of control values 
            WeightList.Controls.Add(set);

        }
        }


    } 

но это тоже не работает. Я думаю, что мне здесь не хватает чего-то очевидного?

25.11.2012

  • Вам просто нужно воссоздать его с правильным идентификатором (переменной count). 25.11.2012

Ответы:


1

Попробуйте это при загрузке страницы:

if(ViewState["Sets"] != null)
{
    int sets = (int)ViewState["Sets"];
    for (int i = 0; i < sets; i++)
    {
        Set set = new Set();
        set.ID =  string.Format("set{0}", i);
        WeightList.Controls.Add(set);
     }
 }

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

25.11.2012
  • Спасибо за предложение, хотя я пробовал, но это не работает. Может быть, я не добавляю его в событие OnInit? 25.11.2012
  • @Luthervd попробуй и посмотри, что получится. Отображается ли правильное количество элементов управления? 25.11.2012
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..