2010-03-06 46 views
0

我已經構建了一個複合控件,該控件呈現一個TextControl或一個RADEditor控件,該屬性可以是一個屬性集。兩個呈現的控件都有一個Text屬性。問題是,當我更改網頁上的Textvalue(運行時)時,它不會設置新的Text-value,而是設置舊的Textvalue。我的ASP.NET複合控件的文本屬性沒有設置文本更改

是否anyboy知道我在做什麼錯?

下面我的複合控制的代碼。

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

你暴露,如標籤,文本屬性,但只能使用它們的CreateChildControls - 這是在頁面生命週期爲時尚早。處理這個問題的最簡單方法是將該屬性委派給子控件,如下面的Label屬性示例所示。您可以類似地處理Text屬性。

或者,您可以在RenderContents覆蓋中設置子控件的屬性,但這會增加一些複雜性。

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

    set 
    { 
     EnsureChildControls(); 
     _myLabel.Text = value; 
    } 
} 
相關問題