代码之家  ›  专栏  ›  技术社区  ›  codymanix

创建自定义面板控件

  •  2
  • codymanix  · 技术社区  · 14 年前

    基于服务器的控件对我来说不是好的解决方案,因为我的面板在默认情况下应该始终包含asp 复选框 这将允许用户隐藏和显示面板内容。

    我将面板创建为模板化用户控件,但现在我遇到了一个问题,即无法在其中声明变量。

    [ParseChildren(true)]
    public partial class MyPanel: System.Web.UI.UserControl
    {
    
        private ITemplate messageTemplate = null;
    
        [TemplateContainer(typeof(MessageContainer))]
        [PersistenceMode(PersistenceMode.InnerProperty)]
        public ITemplate Content
        {
            get
            {
                return messageTemplate;
            }
            set
            {
                messageTemplate = value;
            }
        }
    
        void Page_Init()
        {
            MessageContainer container = new MessageContainer();
            messageTemplate.InstantiateIn(container);
            PlaceHolder1.Controls.Add(container);
        }
    
        [ParseChildren(true)]
        public class MessageContainer : Control, INamingContainer
        {
    
            internal MessageContainer()
            {
            }
    
        }
    }
    

    如果我在 MyPage.aspx 那么控制定义是 插入 MyPage.aspx.designer.cs a他们通常会:

    <my:MyPanel>
      <Content>
        <asp:TextBox id = "foo" runat="server" />
      </Content>
    </my:MyPanel>
    

    因此 foo 不是由设计器创建为控制变量,因此我无权访问它。

    如何创建自己的面板,允许在其中声明控件?

    我现在试着 [ParseChildren(false)] messageTemplate.InstantiateIn(container) 引发异常。

    3 回复  |  直到 9 年前
        1
  •  0
  •   VinayC    14 年前

    你还没有给出控件的代码。通常,它需要实现INamingContainer,并且应该具有ITemplate类型的属性以接受模板。 检查 MSDN 关于如何发展一个。下面是 sample code article 用于数据绑定模板控件。

        2
  •  0
  •   citronas    14 年前

    <asp:TextBox id = "foo"  runat="server"/>
    

    var textbox = this.MyCustomPanel.FindControl("foo") as TextBox;
    

    我想可以通过在Usercontrol的INamingTemplate容器的设计器设置上设置一个属性来实现这种行为,而不是使用FindControl

        3
  •  0
  •   TheGeekYouNeed    14 年前

    您不需要创建模板控件,只需创建一个复合Web控件。创建一个面板复选框,将它们添加到复合控件的控件集合中,调整渲染以根据需要显示它,然后使用它运行。

    here

    *编辑**

    下面是您所需要的工作实现。Make为Web.dll.

    using System;
    using System.ComponentModel;
    using System.Drawing;
    using System.Security.Permissions;
    using System.Web;
    using System.Web.UI;
    using System.Web.UI.WebControls;
    
    
    namespace Web
    {
        [    AspNetHostingPermission(SecurityAction.Demand, Level = AspNetHostingPermissionLevel.Minimal), 
             AspNetHostingPermission(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal),
             ToolboxData("<{0}:CustomPanel runat=\"server\"> </{0}:CustomPanel>"),
    ]
    
        public class CustomPanel : CompositeControl
    {
            private Panel panelContainer;
            private CheckBox chkHideContent;
            private Panel panelInnerContainer;
    
            [Bindable(true),
            Category("Appearance"),
            DefaultValue(""),
            Description("The text to display with the checkbox.")]
            public string CheckBoxText
            {
                get
                {
                    EnsureChildControls();
                    return chkHideContent.Text;
                }
                set
                {
                    EnsureChildControls();
                    chkHideContent.Text = value;
                }
            }
    
            [Bindable(true)]
            [Category("Data")]
            [DefaultValue("")]
            [Localizable(true)]
            public bool IsCheckBoxChecked
            {
                get
                {
                    return chkHideContent.Checked;
                }
            }
    
            [Bindable(true)]
            [Category("Data")]
            [DefaultValue("")]
            [Localizable(true)]
            public bool HideInnerPanel
            {
                set
                {
                    EnsureChildControls();
                    panelInnerContainer.Visible = value;
                }
            }
    
            [Bindable(true)]
            [Category("Data")]
            [DefaultValue("")]
            [Localizable(true)]
            public ControlCollection InnerPanelControls
            {
                get
                {
                    EnsureChildControls();
                    return panelInnerContainer.Controls;
                }
            }
    
            protected virtual void OnCheckboxChanged(EventArgs e)
            {
                if (chkHideContent.Checked)
                {
                    panelInnerContainer.Visible = false;
                }
                else
                {
                    panelInnerContainer.Visible = true;
                }
            }
    
            private void _checkbox_checkChanged(object sender, EventArgs e)
            {
                OnCheckboxChanged(EventArgs.Empty);
            }
    
            protected override void RecreateChildControls()
            {
                EnsureChildControls();
            }
    
            protected override void CreateChildControls()
            {
                Controls.Clear();
    
                panelContainer = new Panel();
                panelContainer.ID = "panelContainer";
    
                chkHideContent = new CheckBox();
                chkHideContent.ID = "chkHideContent";
                chkHideContent.CheckedChanged += new EventHandler(_checkbox_checkChanged);
                chkHideContent.AutoPostBack = true;
    
                panelInnerContainer = new Panel();
                panelInnerContainer.ID = "panelInnerContainer";
    
                this.Controls.Add(panelContainer);
                this.Controls.Add(chkHideContent);
                this.Controls.Add(panelInnerContainer);
            }
    
            protected override void Render(HtmlTextWriter writer)
            {
                panelContainer.RenderBeginTag(writer);
                chkHideContent.RenderControl(writer);
                panelInnerContainer.RenderControl(writer);
                panelContainer.RenderEndTag(writer);
            }
        }
    }
    

    默认.aspx

    <%@ Register assembly="Web" namespace="Web" tagprefix="cc1" %>
    <cc1:CustomPanel ID="CustomPanel1" runat="server" />
    

    默认.aspx.cs

     protected void Page_Load(object sender, EventArgs e)
     {
            Label lbl = new Label();
            lbl.Text = "IT WORKS!";
    
            CustomPanel1.CheckBoxText = "Hide my innards!";
            CustomPanel1.InnerPanelControls.Add(lbl);
     }