Сначала я понимаю необходимость создания динамических элементов управления в разделе OnInit.Динамические элементы управления - C# - CheckBoxList Родитель - Дети
Однако я прочитал документ от Скотта Гатри?
http://scottonwriting.net/sowblog/archive/2004/10/08/162998.aspx
Так у меня сложилось впечатление от этих блогов, если добавить элемент управления в контейнере, то изменить свойства, вы можете получить на контроле в Page_Load.
В двух словах, у меня есть таблица с fk обратно в таблицу, создающая иерархию. Я загружаю 3 пользовательских элемента управления на страницу с помощью списков флажков, которые относятся к родительскому ключу.
Таблица так:
create table myTbl
(
id int identity,
par_id int,
item_desc varchar(25)
other_desc_flag bit
)
Что мои клиенты должны это возможность сделать выбор флажок. Детский набор текстовых полей будет отображаться на основе родителя. Если txt_flag установлен, запись флажка не будет заполнена. Вместо этого они хотят, чтобы метка desc была распечатана с текстовым полем для ответа. Данные пользователя не хранятся в таблице выше.
Итак, проблема заключается в том, что эти текстовые ответы могут быть на любом уровне пользовательского элемента управления. Итак, я создал класс с 3 элементами (id, литеральный элемент управления и текстовое поле). Затем я динамически создаю элементы управления на основе выбора на любом конкретном уровне.
Я читаю каждый уровень в наборе данных, я перебираю набор данных, ища этот флаг. Я фиксирую индексную переменную в строках с этим флагом, и я создаю класс List для хранения идентификатора , text_desc. Затем я удаляю строку из таблицы в наборе данных и привязываю остальные элементы к флажку.
Затем я возвращаюсь к своему управлению и динамически выписываю элементы управления.
Но, как и все, кто передо мной, я делаю злое сражение против цикла страниц ... lol.
Я не могу видеть элементы управления. Я планирую DataBind() мои элементы управления отдельно при загрузке, так как я не дошел до точки, где я получаю ответы клиентов из базы данных. Это на другой день. Заполнитель с моими динамическими элементами управления - это OtherPlaceHolder. Я попытался установить для ViewState значение true и false.
Любые указатели на то, как получить # элементов после возврата в переменную сеанса, чтобы я мог создавать элементы управления в разделе OnInit.
Вот код. Это запускается с мастер-страницы ...
На контроле, я изменил < &> на [], так как эта страница, которая пытается поставить код в в ControlBox с скроллинга был отрезав этот код.
[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]
[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;
}