簡體   English   中英

創建自定義面板控件

[英]Create custom panel control

基於服務器的控件對我來說不是一個好的解決方案,因為我的面板默認應始終包含一個 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 ,它們通常會這樣做:

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

因此foo不是由設計者創建的控制變量,所以我無法訪問它。

如何創建自己的面板,允許在其中聲明控件?

編輯:我現在嘗試使用[ParseChildren(false)] 包含變量的變量現在在表單的設計器代碼中生成。 現在的問題是messageTemplate.InstantiateIn(container)拋出異常。

您還沒有給出控件的代碼。 一般來說,它需要實現 INamingContainer 並且應該具有 ITemplate 類型的屬性來接受模板。 MSDN上查看如何開發一個。 這是來自 MSDN 的示例代碼 另請查看本文以了解數據綁定模板化控件。

首先,您需要使用 runat="server" 屬性。

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

之后你可以試試

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

而不是使用 FindControl 我想可以通過在用戶控件的 INamingTemplate 容器的設計器設置上設置屬性來實現此行為

您不需要創建模板化控件,只需創建一個復合 Web 控件。 創建一個Panel & Checkbox,將它們添加到復合控件的控件集合中,調整渲染使其隨心所欲地顯示,然后運行。

這里

* 編輯 **

這是您需要的工作實現。 為 Web.dll 創建一個引用。

自定義面板.cs

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);
 }

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM