gpt4 book ai didi

asp.net - 自定义 ASP.net 服务器控件 - 呈现

转载 作者:行者123 更新时间:2023-12-04 07:08:56 27 4
gpt4 key购买 nike

我目前正在 ASP.net 中编写自定义服务器控件。我的想法是创建某种可折叠的面板控件(顺便说一句,这是我正在编写的第一个服务器控件)。所以我想要的是用户在页面中以这种方式定义我的控件:

<myCtrl:CollapsiblePanel id="myCollapsiblePanel" runat="server">
<asp:Label id="lblTest" runat="server" Text="Test Label:"/>
<asp:TextBox id="txbTest" runat="server"/>
</myCtrl:CollapsiblePanel>

然后控件应在最终页面上呈现如下:
<div id="myCollapsiblepanel">
<input type="submit" name="btnExpand" value="Expand/Collapse" id="btnExpand" />
<div id="pnlContent">
<span id="lblTest">Title:</span>
<input name="txbTest" type="text" id="txbTest" />
</div>
</div>

提交按钮“btnExpand”在控件上有一个事件处理程序,它隐藏/显示面板“pnlContent”。
我的第一种方法是创建一个从 Panel 继承的服务器控件。在 CollapsiblePanel 控件中,我创建了另一个面板“pnlContent”。在 OnInit 我做了类似以下的事情:
protected override void OnInit(EventArgs e)
{
for (int i = 0; i < base.Controls.Count; i++)
{
Control control = base.Controls[i];
content.Controls.Add(control);
}
base.Controls.Clear();

base.Controls.Add(button);
base.Controls.Add(content);
}

我基本上将当前存在于我的控件中的所有控件添加到内部创建的 Panel pnlContent 的控件列表中。此外,我添加了一个按钮,然后执行 pnlContent 的展开/折叠。
我的问题是不知何故渲染无法正常工作。按钮和 pnlContent 正确呈现,只是 pnlContent 中的控件未显示。输出如下
<div id="myCollapsiblepanel">
<input type="submit" name="btnExpand" value="Expand/Collapse" id="btnExpand" />
<div id="pnlContent"> </div>
</div>

pnlContent 为空...
有人可以建议我解决这个问题和/或我在渲染中做错了什么。我没有覆盖我继承的面板的默认渲染,因为我认为这不是必需的,因为我在 OnInit 中修改了它的控制结构,所以它应该渲染出我的修改..

目前我找到了解决方案。我基本上是按照在 Microsoft Ajax Control 工具包中最常用的方式来完成的。我创建了一个所谓的“扩展器”,它不呈现自身,而只是添加行为。所以现在我将要折叠的面板的 id 添加到我的 CollapsiblePanelExtender 控件中,然后它就会完成折叠/展开的工作。也许这也是更好、更干净的解决方案,但我仍然想知道我之前描述的第一种方法出了什么问题。

谢谢你的帮助!

最佳答案

发生这种情况是因为在任何给定时刻,一个控件只能属于一个父级。当您将一个集合中的控件添加到另一个集合中时,它会自动从第一个集合中删除。在你的情况下:

for (int i = 0; i < Controls.Count; i++)
{
//obtain a reference
Control control = Controls[i];
//The control is removed from Controls collection
//and added to content.Controls. All remaining controls get shifted left.
//This means that next control will get skipped.
content.Controls.Add(control);
}

考虑执行以下操作(顺便说一下,在这种情况下您可能不需要使用 base):
Control[] controls = new Control[Controls.Count];
Controls.CopyTo(controls, 0); //create a snapshot of controls

for (int i = 0; i < controls.Length; i++)
content.Controls.Add(controls[i]);

或使用反向加法:
Control[] controls = new Control[Controls.Count];
for (int i = Controls.Count - 1; i >= 0; i--) //walk backwards
controls[i] = Controls[i];

for (int i = 0; i < controls.Length; i++)
content.Controls.Add(controls[i]);

关于asp.net - 自定义 ASP.net 服务器控件 - 呈现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/668936/

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