Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/32.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 访问UserControl的模板项_C#_Asp.net_User Controls - Fatal编程技术网

C# 访问UserControl的模板项

C# 访问UserControl的模板项,c#,asp.net,user-controls,C#,Asp.net,User Controls,是否可以使用我的逻辑实现自定义用户控件或控件,其作用类似于占位符?使用的示例: <x:MyControl runat="server"> <Template> <asp:TextBox runat="server" ID="MyTextBox" /> ..... any custom code here ........ </Template> </x:MyControl> 我实现了测试

是否可以使用我的逻辑实现自定义
用户控件
控件
,其作用类似于
占位符
?使用的示例:

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

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

您必须在用户控件MyControl中调用函数“FindControl”。 将您的MyControl命名为并
id=“mcContainer”
,然后在您的代码隐藏中调用
((TextBox)mcContainer.FindControl(“MyTextBox”)。Text=“ABC”

关于这一点,请点击这里

为什么我可以在页面中写入
MyTextBox.Text=“ABC”
,而当文本框位于由用户控件实现的命名容器中时,为什么不可以写入

嗯,当您拖放文本框时,ASP.NET页面设计器在为设计器本身保留的页面部分类中为您声明了一个变量,该变量位于类的设计器部分中,您页面中的控件将被声明

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

引用这句话: 使用复合控件时,必须熟悉许多属性和方法,以及InAdminContainer接口。所有复合控件都应该实现INamingContainer接口。实现此接口的控件不需要添加任何方法或属性;相反,实现的接口仅指示控件正在用作复合控件。其效果是呈现子控件,即复合控件的控件集合中的控件,以便其ID以控件命名容器的ID作为前缀。这样可以确保所有子控件都具有唯一的ID值,即使表单上有多个父控件实例。WebControl类具有返回控件父级的NamingContainer属性

因此,当您编写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);
    }
}
<%@ Register Assembly="YOUR_ASSEMBLY" TagPrefix="x" Namespace="YOUR_NAMESPACE" %>
<x:ToolTip runat="server">
    ... any your content here ......
</x:ToolTip>
然后在ASPX文件中注册,如下所示:

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);
    }
}
<%@ Register Assembly="YOUR_ASSEMBLY" TagPrefix="x" Namespace="YOUR_NAMESPACE" %>
<x:ToolTip runat="server">
    ... any your content here ......
</x:ToolTip>

然后像这样使用它:

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);
    }
}
<%@ Register Assembly="YOUR_ASSEMBLY" TagPrefix="x" Namespace="YOUR_NAMESPACE" %>
<x:ToolTip runat="server">
    ... any your content here ......
</x:ToolTip>

... 这里有你的任何内容。。。。。。

现在,您可以在
x:ToolTip
中嵌套任何控件,并将任何合成逻辑添加到
CreateChildControls()

@JohnSaunders-hum,这不是真的。好吧,忘了
UserControl
。是否可以重新设计
占位符的功能?(即使没有
模板
,一切都能正常工作)。这是怎么回事?再发明,你能详细点吗?我不知道。谢谢。@JohnSaunders:).NET是一个世界,我在几年前就做过,但也让人头疼。@JoãoPinho,我的意思是,是否可以创建一个自定义的
控件
,它可以透明地具有嵌套控件,并且这些控件可以直接在页面级别上看到,而无需
FindControl
,绝对像
面板
占位符