【问题标题】:Text-property of my ASP.NET Composite-control doesn't set text-changes我的 ASP.NET 复合控件的文本属性未设置文本更改
【发布时间】:2010-05-27 22:00:08
【问题描述】:

我已经构建了一个复合控件,它呈现一个 TextControl 或一个 RADEditor 控件,它依赖于一组属性。两个呈现的控件都有一个 Text-property。问题是,当我更改网页上的 Textvalue 时(当它运行时),它不会设置新的 Text-value,而是设置旧的 Textvalue。

有没有人知道我做错了什么?

在我的复合控件的代码下方。

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using Telerik.Web.UI;
using System.Web.UI.HtmlControls;
using Framework.WebControls;

namespace Components.Broadcasting.Controls
{

    [DefaultProperty("Text")]
    [ToolboxData("<{0}:TextControl runat=server></{0}:TextControl>")]
    public class TextControl : CompositeControl, INamingContainer, IDisposable
    {       
        //private Control _myControl;
        private Label _myLabel;
        private HtmlGenericControl _contentContainer;
        private HtmlGenericControl _labelBlock;
        private HtmlGenericControl _inputBlock;

        public override ControlCollection Controls
        {
            get
            {
                EnsureChildControls();
                return base.Controls;
            }
        }

        [Bindable(true)]
        [Category("Appearance")]
        [DefaultValue("")]
        [Localizable(true)]
        public string Text
        {
            get
            {                
                String s = (String)ViewState["Text"];
                return ((s == null) ? String.Empty : s);
            }

            set
            {                
                ViewState["Text"] = value;
            }
        }

        [Bindable(true)]
        [Category("Campagne Broadcasting")]
        [DefaultValue("Naam label")]
        [Description("Label horende bij het contenttype")]        
        public string Label
        {
            get
            {
                String s = (String)ViewState["label"];
                return ((s == null) ? String.Empty : s);
            }

            set
            {
                ViewState["label"] = value;
            }
        }

        [Bindable(true)]
        [Category("Campagne Broadcasting")]
        [DefaultValue(XMLElementType.Heading)]
        [Description("Nog in te vullen")]
        public XMLElementType XMLElementType
        {
            get
            {
                if (ViewState["textContentType"] == null) return XMLElementType.Heading;
                return (XMLElementType)ViewState["textContentType"];
            }
            set
            {
                ViewState["textContentType"] = value;
            }
        }

        [Bindable(true)]
        [Category("Campagne Broadcasting")]
        [DefaultValue("0")]
        [Description("Layoutposition of the contentitem")]
        public int ContentPosition
        {
            get
            {
                if (ViewState["contentPosition"] == null) return 0;
                return (int)ViewState["contentPosition"];
            }
            set
            {
                ViewState["textContentType"] = value;
            }
        }

        [Bindable(true)]
        [Category("Campagne Broadcasting")]
        [DefaultValue("0")]
        [Description("Layoutposition of the contentitem")]
        public XmlOutputGroup XMLOutputGroup
        {
            get
            {
                if (ViewState["xmlOutputGroup"] == null) return 0;
                return (XmlOutputGroup)ViewState["xmlOutputGroup"];
            }
            set
            {
                ViewState["xmlOutputGroup"] = value;
            }
        }

        protected override void RecreateChildControls()
        {
            EnsureChildControls();
        }

        protected override void CreateChildControls()
        {
            Controls.Clear();

            string containerClass = "contentContainer";
            string labelBlock = "labelBlock";
            string inputBlock = "inputBlock";

            _myLabel = new Label();
            _myLabel.Text = Label;
            _contentContainer = new HtmlGenericControl("div");
            _contentContainer.Attributes["class"] = containerClass;

            _labelBlock = new HtmlGenericControl("div");
            _labelBlock.Attributes["class"] = labelBlock;
            _inputBlock = new HtmlGenericControl("div");
            _inputBlock.Attributes["class"] = inputBlock;

            _contentContainer = new HtmlGenericControl("div");
            _contentContainer.Attributes["class"] = containerClass;
            _labelBlock.Controls.Add(_myLabel);

            if (XMLElementType == XMLElementType.Heading)
            {
                TextBox _myControl = new TextBox();
                _myControl.Text = this.Text;
                _inputBlock.Controls.Add(_myControl);
            }
            else if (XMLElementType == XMLElementType.Content)
            {
                RadEditor _myControl = new RadEditor();
                _myControl.Content = this.Text;
                _inputBlock.Controls.Add(_myControl);                

            }
            else if (XMLElementType == XMLElementType.SlideTypeName)
            {
                TextBox _myControl = new TextBox();
                _myControl.Text = this.Text;
                _inputBlock.Controls.Add(_myControl);
            }
            else if (XMLElementType == XMLElementType.Image)
            {
                ImageUploader _myControl = new ImageUploader();                
                _inputBlock.Controls.Add(_myControl);
            }

            _contentContainer.Controls.Add(_labelBlock);
            _contentContainer.Controls.Add(_inputBlock);

            this.Controls.Add(_contentContainer);           
        }

        protected override void RenderContents(HtmlTextWriter output)
        {           
            _contentContainer.RenderControl(output);            
        }
    }
}

提前致谢

亲切的问候,帕特里克

【问题讨论】:

    标签: c# asp.net composite-controls


    【解决方案1】:

    您正在公开标签、文本等属性,但仅在 CreateChildControls 中使用它们 - 这在页面生命周期中还为时过早。处理此问题的最简单方法是将属性委托给子控件,如下面的 Label 属性示例所示。您可以类似地处理 Text 属性。

    或者,您可以在 RenderContents 覆盖中设置子控件的属性,但这会增加一些复杂性。

    public string Label  
    {  
        get  
        {  
            EnsureChildControls();
            return _myLabel.Text;
        }  
    
        set  
        {  
            EnsureChildControls();
            _myLabel.Text = value;
        }  
    }  
    

    【讨论】:

      猜你喜欢
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多