从复合控件中获取数据会在回发时添加到占位符

时间:2013-08-06 08:13:37

标签: asp.net postback placeholder abstract-factory composite-controls

我正在尝试基于CompositeControl类创建工厂模式。

一切都很好。除非我理解,否则我必须将控件添加回实际页面上的占位符控件。我已经四处搜索了一些例子并得到一个几乎可以工作的期望它只能用于第一次回发。

我在这里创建了一个示例,我将在这里发布所有代码。

我的网页上的代码,这里最重要的是我想在OnInit上我试图将控件添加回占位符,我想这就是我可能做错了。

using SampleControls;

public partial class Test : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (!IsPostBack)
        {
            //Setup First Control
            Session.Clear();
            BaseCompositeControl ltb = new LabelTextBox();
            PlaceHolder1.Controls.Add(ltb);
            Session.Add("Control", ltb);
        }
    }

    protected override void OnInit(EventArgs e)
    {
        base.OnInit(e);
        // Check if the post back and recreate the control
        if (IsPostBack)
        {
            int c = this.Form.Controls.Count;
            for (int i = 0; i < Session.Count; i++)
            {
                if (Session[i].ToString().Contains("Control"))
                {
                    this.PlaceHolder1.Controls.Add((BaseCompositeControl)(Session[i]));
                }
            }
        }
    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        //Get Postback Date
        BaseCompositeControl oltb = (BaseCompositeControl)this.PlaceHolder1.Controls[0];
        lblPstBck.Text = oltb.Text;

        this.PlaceHolder1.Controls.Clear();
        Session.Clear();

        //Load next Control
        BaseCompositeControl ltb = new LabelCheckBox();
        PlaceHolder1.Controls.Add(ltb);
        Session.Add("Control", ltb);

    }
}

这是复合控件类,我不知道我是否必须在这里做一些事情来处理viewstate或者怎么做?

public abstract  class BaseCompositeControl : CompositeControl
{
    protected string _Title;
    public abstract string Text
    {
        get;
        set;
    }
    public string Title
    {
        get { EnsureChildControls(); 
            return _Title; }
        set { EnsureChildControls(); 
            _Title = value; }
    }

    protected override void CreateChildControls()
    {
        // Clears child controls
        Controls.Clear();
        // Build the control tree
        CreateControlHierarchy();
        ClearChildViewState();
    }

    protected abstract void CreateControlHierarchy();
}

TextBox控件

public class LabelCheckBox : BaseCompositeControl
{
    protected CheckBox _CheckBox;

    public override string Text
    {
        get
        {
            EnsureChildControls();
            return _CheckBox.Checked.ToString(); ;
        }
        set
        {
            EnsureChildControls();
            _CheckBox.Checked = Convert.ToBoolean(value);
        }
    }
    protected override void CreateControlHierarchy()
    {
        _CheckBox = new CheckBox();
        Label l = new Label();
        // Configure controls
        l.Text = "Second Control";
        // Connect to the parent
        Controls.Add(l);
        Controls.Add(_CheckBox);
    }
}

复选框控件

    public class LabelTextBox : BaseCompositeControl
{
    protected TextBox _Text;
    public override string Text
    {
        get
        {
            EnsureChildControls();
            return _Text.Text;
        }
        set
        {
            EnsureChildControls();
            _Text.Text = value;
        }
    }
    protected override void CreateControlHierarchy()
    {
        Label l = new Label();
        _Text = new TextBox();
        // Configure controls
        l.Text = "First Control";
        // Connect to the parent
        Controls.Add(l);
        Controls.Add(_Text);
    }
}

1 个答案:

答案 0 :(得分:0)

很久以前我问过这个问题,

但我认为你应该这样做。使用工厂模式进行用户控制。

http://weblogs.asp.net/sfeldman/archive/2007/12/17/factory-pattern-for-user-controls.aspx