C# 如何在自定义控件中创建转换为模板的功能

C# 如何在自定义控件中创建转换为模板的功能,c#,asp.net,C#,Asp.net,我已经为电子邮件创建了自定义控件,其中包含textbox和expression validator。我还将类库项目dll添加到工具箱中 当我拖放控件时,我的控件也可以工作。如果我拖放控件并编写我自己的标记,那么它也可以工作,但不是编写标记,我希望当我转到aspx页面的设计并选择我的控件时,在智能标记中,我应该获得转换为模板的选项,当我单击我在控件中提供的默认标记应该是render。有人能帮我实现这一点吗 我的模板代码是 using System; using System.ComponentMo

我已经为电子邮件创建了自定义控件,其中包含textbox和expression validator。我还将类库项目dll添加到工具箱中

当我拖放控件时,我的控件也可以工作。如果我拖放控件并编写我自己的标记,那么它也可以工作,但不是编写标记,我希望当我转到aspx页面的设计并选择我的控件时,在智能标记中,我应该获得转换为模板的选项,当我单击我在控件中提供的默认标记应该是render。有人能帮我实现这一点吗

我的模板代码是

using System;
using System.ComponentModel;
using System.Web.UI;
using System.Web.UI.WebControls;

namespace CustomControl
{

[ParseChildren(ChildrenAsProperties = true)]
[ValidationPropertyAttribute("Text")]
public class Email : CompositeControl, INamingContainer
{


    /// <summary>
    /// declaration of variable of type ITemplate
    /// </summary>
    private ITemplate layoutTemplate;
    private Control myLayoutTemplateContainer;



    /// <summary>
    /// Property which is used as tag for specify the markup in control
    /// </summary>
    [Browsable(true),
    DefaultValue(null),
    Description("The layout template."),
    TemplateContainer(typeof(EmailTemplateContainer)),
    PersistenceMode(PersistenceMode.InnerProperty)]
    public ITemplate LayoutTemplate
    {
        get
        {
            return layoutTemplate;
        }
        set
        {
            layoutTemplate = value;
        }
    }

    /// <summary>
    /// This textbox is used for enter emailid
    /// </summary>
    private TextBox emailTextbox;


    /// <summary>
    /// Regular expression validator
    /// </summary>
    private RegularExpressionValidator emailValidationExpression;

    /// <summary>
    /// This property contains maxlength of textbox
    /// </summary>
    private int maxLength;

    public int MaxLength
    {
        get
        {
            return maxLength;
        }
        set
        {
            maxLength = value;
        }
    }

    /// <summary>
    /// This property contains Validation group for textbox control
    /// </summary>
    private string validationGroup;

    public string ValidationGroup
    {
        get
        {
            return validationGroup;
        }
        set
        {
            validationGroup = value;
        }
    }

    /// <summary>
    /// Control container for Layout template
    /// </summary>
    public Control MyLayoutTemplateContainer
    {
        get
        {
            return myLayoutTemplateContainer;
        }
    }

    protected override void CreateChildControls()
    {
        // If markup for control is given then if block will execute otherwise else block will execute which is default
        if (LayoutTemplate != null)
        {
            myLayoutTemplateContainer = new EmailTemplateContainer(this);
            LayoutTemplate.InstantiateIn(myLayoutTemplateContainer);
            Controls.Add(myLayoutTemplateContainer);
        }
        else
        {
            /// <summary>
            /// This is default markup for control if markup to the control is not given then this block will execute
            /// </summary>
            //Assigning properties to textbox
            this.emailTextbox = new TextBox();
            this.emailTextbox.ID = "EmailTextbox";
            emailTextbox.MaxLength = this.MaxLength;
            this.Controls.Add(emailTextbox);

            // Email regular expression validators properties
            this.emailValidationExpression = new           RegularExpressionValidator();
            emailValidationExpression.ValidationGroup =     this.ValidationGroup;
            emailValidationExpression.ControlToValidate = emailTextbox.ID;
            emailValidationExpression.Display = ValidatorDisplay.Dynamic;
            emailValidationExpression.Attributes.CssStyle.Add("color", "red");
            emailValidationExpression.ValidationExpression = Constant.EMAIL_REGULAR_EXPRESSION;
            emailValidationExpression.ErrorMessage = Resource.WrongEmailMessage;
            this.Controls.Add(emailValidationExpression);
        }
    }

    protected override void Render(HtmlTextWriter writer)
    {
        if (emailTextbox != null)
        {
            emailTextbox.RenderControl(writer);
            emailValidationExpression.RenderControl(writer);

        }

        if (myLayoutTemplateContainer != null)
        {
            myLayoutTemplateContainer.RenderControl(writer);
        }
    }
}


public class EmailTemplateContainer : Control, INamingContainer
{
    private Email parent;

    public EmailTemplateContainer(Email parent)
    {
        this.parent = parent;
    }

    public string ValidationGroup
    {
        get
        {
            return parent.ValidationGroup;
        }
    }

    public int MaxLength
    {
        get
        {
            return parent.MaxLength;
        }
    }
}
使用系统;
使用系统组件模型;
使用System.Web.UI;
使用System.Web.UI.WebControl;
命名空间自定义控件
{
[解析子对象(ChildrenAsProperties=true)]
[验证属性属性(“文本”)]
公共类电子邮件:CompositeControl,INamingContainer
{
/// 
///ITemplate类型变量的声明
/// 
私有项目板布局模板;
私有控制myLayoutTemplateContainer;
/// 
///属性,该属性用作控件中指定标记的标记
/// 
[可浏览(正确),
默认值(null),
说明(“布局模板”),
TemplateContainer(类型为(EmailTemplateContainer)),
PersistenceMode(PersistenceMode.InnerProperty)]
公共项目板布局模板
{
得到
{
返回模板;
}
设置
{
layoutTemplate=值;
}
}
/// 
///此文本框用于输入emailid
/// 
私人文本框emailTextbox;
/// 
///正则表达式验证器
/// 
private RegularExpressionValidator emailValidationExpression;
/// 
///此属性包含textbox的maxlength
/// 
私有整数最大长度;
公共整数最大长度
{
得到
{
返回最大长度;
}
设置
{
maxLength=值;
}
}
/// 
///此属性包含textbox控件的验证组
/// 
私有字符串验证组;
公共字符串验证组
{
得到
{
返回验证组;
}
设置
{
validationGroup=值;
}
}
/// 
///布局模板的控件容器
/// 
公共控件MyLayoutTemplateContainer
{
得到
{
返回myLayoutTemplateContainer;
}
}
受保护的覆盖无效CreateChildControls()
{
//若给出了控件的标记,那个么If块将执行,否则else块将执行,这是默认值
如果(LayoutTemplate!=null)
{
myLayoutTemplateContainer=新的EmailTemplateContainer(此);
LayoutTemplate.InstanceIn(myLayoutTemplateContainer);
添加(myLayoutTemplateContainer);
}
其他的
{
/// 
///这是控件的默认标记。如果未给出控件的标记,则将执行此块
/// 
//为文本框指定属性
this.emailTextbox=新文本框();
this.emailTextbox.ID=“emailTextbox”;
emailTextbox.MaxLength=此.MaxLength;
this.Controls.Add(emailTextbox);
//电子邮件正则表达式验证程序属性
this.emailValidationExpression=新的RegularExpressionValidator();
emailValidationExpression.ValidationGroup=this.ValidationGroup;
emailValidationExpression.ControlToValidate=emailTextbox.ID;
emailValidationExpression.Display=validationDisplay.Dynamic;
emailValidationExpression.Attributes.csssstyle.Add(“颜色”、“红色”);
emailValidationExpression.ValidationExpression=Constant.EMAIL\u正则表达式;
emailValidationExpression.ErrorMessage=Resource.ErrorEmailMessage;
this.Controls.Add(emailValidationExpression);
}
}
受保护的覆盖无效渲染(HtmlTextWriter编写器)
{
如果(emailTextbox!=null)
{
emailTextbox.RenderControl(编写器);
emailValidationExpression.RenderControl(编写器);
}
if(myLayoutTemplateContainer!=null)
{
myLayoutTemplateContainer.RenderControl(编写器);
}
}
}
公共类EmailTemplateContainer:控件,InAdminContainer
{
私人电子邮件家长;
公共EmailTemplateContainer(电子邮件父级)
{
this.parent=parent;
}
公共字符串验证组
{
得到
{
返回parent.ValidationGroup;
}
}
公共整数最大长度
{
得到
{
返回parent.MaxLength;
}
}
}
}