Сначала я понимаю необходимость создания динамических элементов управления в разделе 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]
[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;
}