我已经构建了一个复合控件,它可以渲染一个TextControl或一个RADEditor控件,可以控制一个属性。两个渲染控件都具有Text属性。问题是,当我更改网页上的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);
}
}
}
提前致谢
亲切的问候,帕特里克
答案 0 :(得分:0)
您正在公开Label,Text等属性,但仅在CreateChildControls中使用它们 - 这在页面生命周期中过早。处理此问题的最简单方法是将属性委托给子控件,如下面的Label属性示例所示。您可以类似地处理Text属性。
或者,您可以在RenderContents覆盖中设置子控件的属性,但这会增加一些复杂性。
public string Label
{
get
{
EnsureChildControls();
return _myLabel.Text;
}
set
{
EnsureChildControls();
_myLabel.Text = value;
}
}