是否可以实现自定义UserControl
或Control
,它的作用像PlaceHolder
,但是使用我的逻辑?使用的示例:
<x:MyControl runat="server">
<Template>
<asp:TextBox runat="server" ID="MyTextBox" />
..... any custom code here ........
</Template>
</x:MyControl>
然后在代码中:
MyTextBox.Text = "ABC";
我实现了测试控件,但是我无法在页面级别访问嵌套的ASP控件。错误是The name "MyTextBox" does not exist in the current context
。
您必须在用户控制mycontrol中调用函数" findcontrol"。用和 id="mcContainer"
命名您的control,然后在您的代码后面拨打((TextBox)mcContainer.FindControl("MyTextBox")).Text = "ABC";
。
Wiki在这里如何:创建模板ASP.NET用户控件
为什么我可以在页面中编写 MyTextBox.Text="ABC"
,为什么当文本框在用户控件实现的命名容器内部时,为什么不可能?
好吧,当您拖动n丢弃文本框时,ASP.NET页面设计师在为设计师本身保留的页面的部分类别中为您声明了一个变量,就在您的类设计师部分中,您的控制者在您的控制中控制您页面被声明。
因此,当您拖放用户控件并在其命名容器的内部创建一个文本框时,您无法直接访问它,因为您的页面不容纳该控件控制只有在用户控件本身实现期间运行时可用,动机与ASP.NET页面解析器渲染控制的方式有关。
引用此资源:使用复合控件时,重要的是要熟悉许多属性和方法以及inamingcontainer接口。所有复合控件均应实现InamingContainer接口。实现此接口的控制不需要添加任何方法或属性;相反,实现的接口仅表示控件被用作复合控制。效果在于,儿童控制(即复合控件中的控件集合中的控件)已呈现,以便将其ID置于控件的命名容器的ID之前。这确保所有子女控制都将具有唯一的ID值,即使表单上有多个父母控制的实例。WebControl类具有命名container属性,该属性返回控件的父。
所以,当您编写myTextbox时,您的文本框名称至少应该像$ McContainer $ MyTextbox之类的内容。因此,因此,无法透明地做您打算的事情。
解决方案。
创建类似的类:
public class ToolTip : PlaceHolder
{
protected override void CreateChildControls()
{
HtmlGenericControl div1 = new HtmlGenericControl("div");
div1.Attributes.Add("id", ClientID);
div1.Attributes.Add("class", "tooltip");
while (Controls.Count != 0)
div1.Controls.Add(Controls[0]);
Controls.Add(div1);
}
}
然后将其注册在ASPX文件中:
<%@ Register Assembly="YOUR_ASSEMBLY" TagPrefix="x" Namespace="YOUR_NAMESPACE" %>
然后这样使用:
<x:ToolTip runat="server">
... any your content here ......
</x:ToolTip>
现在,您可以在x:ToolTip
的内部嵌套任何控件,并将任何构图逻辑添加到CreateChildControls()
。