MSDN пример составного управления - PullRequest
1 голос
/ 22 февраля 2011

Я читаю пример кода MSDN на элементах управления Composite и нахожу, что есть одна вещь, которую я не понимаю. Используя код здесь Я создал элемент управления LabelTextBox в своем проекте и добавил его на страницу. Если я введу новое значение в текстовое поле в элементе управления, событие нажатия кнопки будет иметь старое значение, когда я отправляю сообщение на сервер. Если я позволю странице продолжить обработку, то страница завершится перезагрузкой с новым значением. Это плохой пример или я что-то упустил? Разве измененное значение не должно быть загружено в элемент управления до срабатывания события кнопки?

Составной контрольный код:

public class LabelTextBox : WebControl, INamingContainer
{
    public string Text
    {
        get
        {
            object o = ViewState["Text"];
            if (o == null)
                return String.Empty;
            return (string)o;
        }
        set { ViewState["Text"] = value; }
    }
    public string Title
    {
        get
        {
            object o = ViewState["Title"];
            if (o == null)
                return String.Empty;
            return (string)o;
        }
        set { ViewState["Title"] = value; }
    }
    protected override void CreateChildControls()
    {
        Controls.Clear();
        CreateControlHierarchy();
        ClearChildViewState();
    }
    protected virtual void CreateControlHierarchy()
    {
        TextBox t = new TextBox();
        Label l = new Label();
        t.Text = Text;
        l.Text = Title;
        Controls.Add(l);
        Controls.Add(t);
    }
}

Я попытался создать элемент управления декларативно и программно без изменений в результатах. Программный код создания:

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Form.Controls.Add(new LiteralControl("<br /><br />"));

        TextBox tb = new TextBox();
        tb.Text = "before";
        Form.Controls.Add(tb);

        Form.Controls.Add(new LiteralControl("<br /><br />"));

        LabelTextBox ltb = new LabelTextBox();
        ltb.Title = "title";
        ltb.Text = "before";
        Form.Controls.Add(ltb);


    }

    protected void Button1_Click(object sender, EventArgs e)
    {
        foreach( var c in Form.Controls)
        {
            var control = c as TextBox;
            if (control != null) 
            {
                System.Diagnostics.Debug.WriteLine(String.Format("TextBox: {0}", control.Text)); 
            }
            else
            {
                var control2 = c as LabelTextBox;
                if (control2 != null)
                {
                    System.Diagnostics.Debug.WriteLine(String.Format("LabelTextBox: {0}", control2.Text));
                }
            }
        }
    }
}

1 Ответ

2 голосов
/ 22 февраля 2011

Я думаю, что проблема с вашим первым подходом состоит в том, что вы сохраняете значения в Viewstate родителя, но никогда не читаете значения обратно из дочерних элементов.Попробуйте что-то вроде:

public class LabelTextBox : WebControl, INamingContainer
{
    private Label _Label     = new Label() { ID="uxLbl" };
    private TextBox _TextBox = new TextBox() { ID="uxTb" };

    public string Text
    {
        get { return _TextBox.Text; }
        set { _TextBox.Text = value; }
    }
    public string Title
    {
        get { return _Label.Text; }
        set { _Label.Text = value; }
    }
    protected override void CreateChildControls()
    {
        Controls.Clear();
        CreateControlHierarchy();
    }
    protected virtual void CreateControlHierarchy()
    {
        Controls.Add(_Label);
        Controls.Add(_TextBox);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...