首先我明白需要在OnInit部分中构建动态控件。动态控件 - C# - CheckBoxList父 - 儿童
但是,我读了Scott Guthrie的文件?
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类来保存ID为text_desc的 。然后,我从数据集中的表中删除该行,并将剩余的项绑定到复选框列表。
然后我回到我的控制并动态写出控件。
但是和我之前的所有人一样,我正在与Page Cycle做恶战......大声笑。
我看不到控件。我计划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;
}