gpt4 book ai didi

c# - 动态控件 - C# - CheckBoxList Parent - Children

转载 作者:太空宇宙 更新时间:2023-11-03 16:49:16 24 4
gpt4 key购买 nike

首先,我了解在 OnInit 部分构建动态控件的必要性。

但是,我阅读了 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。然后,我从数据集中的表中删除该行,并将剩余的项目绑定(bind)到复选框列表。

然后我回到我的控件并动态写出控件。

但就像我之前的所有人一样,我正在与页面周期进行邪恶的斗争......大声笑。

我看不到控件。我计划在加载时分别对我的控件进行 DataBind(),因为我还没有达到从数据库中获取客户端响应的程度。那是另一天。我的动态控件的占位符是 OtherPlaceHolder。我尝试将 Viewstate 设置为 true 和 false。

有关如何将回发中的项目数获取到 session 变量的任何指示,以便我可以在 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;
}

最佳答案

假设当您说“我看不到控件”时,您的意思是当您尝试在回传中访问它们时得到空引用(而不是 HTML 不包含它们),您是否尝试使用 Page.EnsureChildControls()?

关于c# - 动态控件 - C# - CheckBoxList Parent - Children,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4674577/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com