передача значений между составными элементами управления - PullRequest
0 голосов
/ 20 марта 2012

У меня есть элемент управления: составной элемент управления, который определяет кнопку.Кнопка вызывает событие Command и устанавливает значение свойства другого элемента управления, прежде чем сделать элемент управления видимым.

Оба этих элемента управления создаются внутри элемента управления контейнера перед его использованием.Мне нужно получить значение свойства во второй форме в методе CreateChildControls (), однако это невозможно, почему?

Сценарий:

public class Main : CompositeControl
{ 
    #region fields
    private StepPersonal _stepPersonal;
    private StepFinancial _stepFinancial;
    #endregion

    protected override CreateChildControls()
    {
        this._stepPersonal = new StepPersonal { ID = "StepPersonal1", Visible = true };
        this.Controls.Add(this._stepPersonal);
        this._stepFinancial = new StepFinancial { ID = "StepFinancial1", Visible = false };
        this.Controls.Add(this._stepFinancial);
    }

    protected override Render(HtmlTextWriter writer)
    {
        this._stepPersonal.RenderControl(writer);
        this._stepFinancial.RenderControl(writer);
    }
}

StepPersonal:

public class StepPersonal : CompositeControl
{
    #region fields
    private Button _checkDetails;
    #endregion

    protected override CreateChildControls()
    {
        this._checkDetails = new Button { ID = "CheckDetailsButton", Text = "CheckDetails", CommandName = "DetailsConfirmation" }
        this._checkDetails.Command += new CommandEventHandler(this.OnCheckDetails);
        this.Controls.Add(this._checkDetails);
    }

    protected override Render(HtmlTextWriter writer)
    {
        this._checkDetail.RenderControl(writer);        
    }

    protected void OnCheckDetails(object sender, CommandEventArgs args)
    {
        string argument = args.CommandArgs.ToString();

        this.Visible = false;
        Main owner = (sender as Button).FindParent<Main>(); // custom extension method
        StepFinancial sf = owner.FindControl<StepFinancial>("StepFinancial1");
        sf.Argument = argument;
        sf.Visible = false;
    }
}

И, наконец, вот в чем моя проблема, StepFinancial control

public class StepFinancial : CompositeControl
{
    #region fields
    private TextBox _argumentTextBox;
    #endregion

    #region properties
    public string Argument { get; set; }
    #endregion

    protected override CreateChildControls()
    {
        string argument = this.Argument; // this is always null

        // I have buttons in here (not being displayed) who's events are not wiring up
        // if I move this into a method, and call the method in Render(), as it seems
        // to allow me access to the properties there, but I need the value here?
    }

    protected override Render(HtmlTextWriter writer)
    {
        string argument = this.Argument; // this contains the value of the property set previously

        this._argumentTextBox.RenderControl(writer);
    }
}

I 'мы пытались добавить значение в StateBag, ничего.Я попытался добавить QueryString в CommandEventHanlder, но получить коллекцию заблокировано сообщение об ошибке.Я пробовал кеш и сеансы (сеансы не будут работать, потому что они будут развернуты в SharePoint), так что об этом не может быть и речи.Я пробовал Googling, Bing'ing даже Yahoo!это, но не повезло.

Обновление Я не упомянул, не могу добавить элементы управления в коллекцию в OnPreRender, поскольку она не связывает ни одно из событий.Я также не могу использовать EnsureChildControls, так как он портит другие части приложения.Однако я могу добавить значение из свойства на этом уровне в пакет состояний, но я чувствую, что это очень плохой способ сделать это.

1 Ответ

0 голосов
/ 20 марта 2012

Я на самом деле не решил эту проблему, так как мне было бы удобно, но у меня есть решение NoSQL, лежащее в основе этого, и я сохраняю значения между элементами управления и удаляю его, когда приложение закрывается.

...