Динамические элементы управления - C # - Родитель CheckBoxList - Дети - PullRequest
2 голосов
/ 13 января 2011

Сначала я понимаю необходимость создания динамических элементов управления в разделе OnInit.

Тем не менее, я читаю документ от Скотта Гатри?

http://scottonwriting.net/sowblog/archive/2004/10/08/162998.aspx

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

В двух словах, у меня есть таблица с fk назад к таблице, создающая иерархию.Я загружаю 3 usercontrols страницы со списками флажков, которые связаны через родительский ключ.

Таблица, подобная этой:

create table myTbl
(
id   int identity,
par_id int,
item_desc  varchar(25)
other_desc_flag bit
)

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

Итак, проблема, с которой я сталкиваюсь, заключается в том, что эти текстовые ответы могут быть на любом уровне пользовательского элемента управления.Поэтому я создал класс из 3 элементов (идентификатор, буквенный элемент управления и текстовое поле).Затем я динамически создаю элементы управления на основе выбора на любом конкретном уровне.

Я считываю каждый уровень в набор данных, я перебираю набор данных в поисках этого флага.Я фиксирую переменную индекса в строках с этим флагом и создаю класс List для id, text_desc.Затем я удаляю строку из таблицы в наборе данных и привязываю оставшиеся элементы к списку флажков.

Затем я возвращаюсь к своему элементу управления и динамически записываю элементы управления.

Но, как и все те, кто был до меня, я веду злую битву против Цикла страниц ... лол.

Я не вижу элементы управления.Я планирую DataBind () мои элементы управления отдельно под нагрузкой, так как я не дошел до точки, где я получаю отклики клиентов из базы данных.Это на другой день.Заполнитель с моими динамическими элементами управления - OtherPlaceHolder.Я попытался установить Viewstate в true и false.

Любые указатели на то, как получить количество элементов при обратной передаче в переменную сеанса, чтобы я мог создавать элементы управления в разделе OnInit.

Вот код.Это выполняется с главной страницы ...

На элементах управления я изменил <&> на [], потому что эта страница, которая пытается поместить код в блок управления с полосами прокрутки, обрезала этот код.

[asp:UpdatePanel ID="UpdPanel" runat="server" EnableViewState="true" UpdateMode="Always"]
[ContentTemplate]
     [asp:Table runat="server" ID="ContainerTbl"]
            [asp:TableHeaderRow]
                 [asp:TableHeaderCell ColumnSpan="2" CssClass="tdCell"][asp:Literal ID="LitDesc" runat="server" Text="Level" /][/asp:TableHeaderCell]
            [/asp:TableHeaderRow]
            [asp:TableRow]
                [asp:TableCell runat="server" ID="tblItems" VerticalAlign="top"]
                    [asp:PlaceHolder runat="server" ID="CtrlPlaceHolder"]
                       [asp:CheckBoxList ID="cboItems"  Visible="false" runat="server" AutoPostBack="true"][/asp:CheckBoxList]
                       [asp:HiddenField ID="otherCnt" runat="server" /]
                    [/asp:PlaceHolder]
                    [asp:PlaceHolder runat="server" ID="OtherPlaceHolder"  EnableViewState="false"]
                    [/asp:PlaceHolder]
                [/asp:TableCell]
           [/asp:TableRow]

            [asp:TableRow]
                [asp:TableCell  VerticalAlign="top"]
                    [asp:Label ID="LabMsg" runat="server" CSSClass="tdCell" Font-Bold="true" Visible="false"/]
                [/asp:TableCell]
            [/asp:TableRow]
        [/asp:Table]
    &nbsp;
        [asp:HiddenField ID="hLevel"  runat="server" Value="" /]

[/ContentTemplate]
[/asp:UpdatePanel]
 private void WriteOutQuestions(List<Questions> qList)
    {
        int itemCnt = 1;

        // clear any controls in other place holder first. 
        OtherPlaceHolder.Controls.Clear();
        Table OTD = new Table();
        foreach (Questions qst in qList)
        {
            // we're going to create the new control and add to 
            // the placeholder - OtherPlaceholder
            // we'll then reference those controls and add the data to those
            // controls. 
            // see dynamic control article: http://scottonwriting.net/sowblog/archive/2004/10/08/162998.aspx

            HiddenField hItemId = new HiddenField();
            TextBox txtItem = new TextBox();
            LiteralControl ltcItem = new LiteralControl();
            // add the new controls
            string strItemId = "hItem" + Convert.ToString(itemCnt);
            string strTxtItem = "txtItem" + Convert.ToString(itemCnt);
            string strLtcItem = "ltcItem" + Convert.ToString(itemCnt);
            hItemId.ID = strItemId;
            hItemId.EnableViewState = true;
            txtItem.ID = strTxtItem;
            txtItem.EnableViewState = true;
            ltcItem.ID = strLtcItem;
            ltcItem.EnableViewState = true;
            OTD.Controls.Add(OtherDescAddControl(OtherPlaceHolder, hItemId, ltcItem, txtItem));

            // now reference the new added controls and set values from Question object...

            ++itemCnt;
        }
        OtherPlaceHolder.Controls.Add(OTD);
        // now post data to controls...
        itemCnt = 1;
        foreach (Questions qst in qList)
        {
            string strItemId = "hItem" + Convert.ToString(itemCnt);
            string strTxtItem = "txtItem" + Convert.ToString(itemCnt);
            string strLtcItem = "ltcItem" + Convert.ToString(itemCnt);
            HiddenField hfld = (HiddenField)OtherPlaceHolder.FindControl(strItemId);
            TextBox txtBox = (TextBox)OtherPlaceHolder.FindControl(strTxtItem);
            LiteralControl ltx = (LiteralControl)OtherPlaceHolder.FindControl(strLtcItem);
            hfld.Value = qst.HFld.ToString();
            txtBox.Text = qst.TxtBox;
            txtBox.Attributes.Add("class", "txtBox");
            ltx.Text = qst.Ltc.ToString();
            ++itemCnt;
        }
        //decrement itemCnt and populate box here...
        --itemCnt;
        HiddenField hfldCnt = (HiddenField)CtrlPlaceHolder.FindControl("otherCnt");
        hfldCnt.Value = Convert.ToString(itemCnt);
        hfldCnt.Visible = true;
    }

Ответы [ 3 ]

0 голосов
/ 13 января 2011

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

List<HiddenField> HiddenFields = new List<HiddenField>{};
List<TextBox> TextBoxs = new List<TextBox>{};
List<LiteralControl> LiteralControls = new List<LiteralControl>{};


OTD.Controls.Add(OtherDescAddControl(OtherPlaceHolder, hItemId, ltcItem, txtItem));
// do this for all your items that you load to page (add them to your list).
HiddenFields.Add(hItemId);
// when you are done with loading all your controls to page, add your populated Lists                        to session. 
Session["HiddenFields"] = HiddenFields;


//On Page_Init or Page_Load, simpy load them back IF **page is postback**.
If(Page.IsPostBack)
{
    LoadControlsFromSession();
}

private void LoadControlsFromSession()
{
    HiddenFields = Session["HiddenFields"] as List<HiddenFields>;
    // Load all your List objects from session like above.
    int counter = 0;
    if(HiddenFields != null)
    {
        foreach(HiddenField hdnField in HiddenFields)
        {
            //load your objects with the same method you have from your List.
            OTD.Controls.Add(OtherDescAddControl(OtherPlaceHolder, HiddenFields[counter], LiteralControls[counter], TextBoxs[counter]));
            counter++;
        }
    }
}
0 голосов
/ 14 января 2011

Прошу прощения за отсутствие ясности.

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

Я нашел интересное решение этой проблемы. На page_unload я проанализировал элементы управления в массиве хеш-таблиц идентификатора базы данных и текстового ответа пользователя.

0 голосов
/ 13 января 2011

Предполагая, что когда вы говорите «Я не вижу элементы управления», вы имеете в виду, что вы получаете нулевые ссылки, когда пытаетесь получить к ним доступ в обратной передаче (вместо того, чтобы HTML не содержал их),пытался использовать Page.EnsureChildControls ()?

...