gpt4 book ai didi

c# - 访问 UserControl 的模板项

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

是否可以实现自定义 UserControlControl,它们的作用类似于 PlaceHolder,但符合我的逻辑?使用示例:

<x:MyControl runat="server">
<Template>
<asp:TextBox runat="server" ID="MyTextBox" />
..... any custom code here ........
</Template>
</x:MyControl>

然后在代码隐藏中:

MyTextBox.Text = "ABC";

我实现了测试控件,但无法访问页面级别的嵌套 ASP 控件。错误是 当前上下文中不存在名称“MyTextBox”

最佳答案

您必须在您的用户控件 MyControl 中调用函数“FindControl”。使用 id="mcContainer" 命名您的 MyControl,然后在您的代码后面调用 ((TextBox)mcContainer.FindControl("MyTextBox")).Text = "ABC";.

Wiki 关于这里 How to: Create Templated ASP.NET User Controls

为什么我可以在页面中编写 MyTextBox.Text="ABC",而当文本框位于用户控件实现的命名容器内时为什么不能这样写?

好吧,当你拖动 N 放下你的文本框时,ASP.NET 页面设计器在为设计器本身保留的页面的部分类中为你声明了一个变量,它在你的类的设计器部分中,你在你的控件中页面已声明。

因此,当您拖放用户控件并在其命名容器内创建一个文本框时,您无法直接访问它,因为您的页面不包含对该控件的引用,这是因为控件将仅在用户控件本身实例化期间在运行时可用,其动机部分与 ASP.NET 页面解析器呈现控件的方式有关。

引用此 resource :使用复合控件时,熟悉许多属性和方法以及 INamingContainer 接口(interface)非常重要。所有复合控件都应实现 INamingContainer 接口(interface)。实现该接口(interface)的控件不需要添加任何方法或属性;相反,实现的接口(interface)仅仅表明该控件被用作复合控件。效果是子控件(即复合控件的 Controls 集合中的控件)被呈现,以便它们的 ID 以控件命名容器的 ID 为前缀。这可确保所有子控件都具有唯一的 ID 值,即使在一个 Form 上有多个父控件实例也是如此。 WebControl 类有一个返回控件父级的 NamingContainer 属性。

因此,当您编写 MyTextBox 时,您的文本框名称至少应类似于 $mcContainer$MyTextBox。所以正因为如此,没有办法透明地做你想做的事。

关于c# - 访问 UserControl 的模板项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21635178/

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