Как получить доступ к значениям записей из динамически загружаемого пользовательского элемента управления - PullRequest
1 голос
/ 05 марта 2012

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

Мне пришлось создать класс для передачи переменных в / из динамически загружаемого элемента управления.Я назвал его PBUserControl.

public class PBUserControl : UserControl
{
    public IList<NVP> NameValuePairs { get { return _NameValuePairs; } }

    public class NVP
    {
        public NVP() { }
        public NVP(string name, string value)
        {
            this.Name = name;
            this.Value = value;
        }
        public string Name { get; set; }
        public string Value { get; set; }
    }
}

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

Мой динамически загружаемый пользовательский элемент управления:

public partial class Basic : PBUserControl 
{
    protected void Page_Load(object sender, EventArgs e)
    {
        if (this.IsPostBack == false)
        {
            this.InitializeControl();
        }
        else
        {
            this.ProcessSubmit();
        }
    }

    private void InitializeControl()
    {
        DynamicLiteral.Text = "Some Dynamic Content. " + GetNameValue("TestContent");
        TestTextBox.Text = GetNameValue("Test");
    }
    private void ProcessSubmit()
    {
        AddNameValuePair("TestContent", "Passing back some value... "+ DynamicLiteral.Text);
        AddNameValuePair("Test", TestTextBox.Text);
    }
}

ЗдесьЭта страница вызывает и включает этот динамически загружаемый элемент управления:

public partial class PageAddEdit : PageBase
{
    private PBUserControl _PBUserControl;

    protected void Page_Load(object sender, EventArgs e)
    {
        // Must always desigante the control here else it dissapears.
        Control TemplateUserControl = LoadControl("~/Administrator/PageBuilder/Templates/Basic.ascx");
        _PBUserControl = (PBUserControl)TemplateUserControl;
        _PBUserControl.AddNameValuePair("TestContent", "It is working!!!!!!!!!");
        _PBUserControl.AddNameValuePair("Test", "Some test text.");
        Template.Controls.Add(TemplateUserControl);
    }

    protected void MenuGroupRadMenu_Clicked(object sender, EventArgs e)
    {
        IList<PBUserControl.NVP> nvp = _PBUserControl.NameValuePairs;
    }
}

Позвольте мне объяснить, что здесь происходит.Я могу установить значения в PBUserControl с главной страницы.Он отлично переходит в динамически загружаемый пользовательский элемент управления.Делает то, что должен делать.Работает замечательно.

Однако событие page_load в динамически загружаемом элементе управления запускается до обработки переменных обратной передачи.Поэтому на данный момент содержимое TextBox еще даже не читается.Я выяснил это с помощью исследований.Кроме того, если я помещаю событие Pre_Rendered в динамически загружаемый элемент управления, я могу увидеть значение TextBox при пошаговом выполнении кода с помощью отладчика.Кроме того, с помощью отладчика я вижу, что TextBox не читается во время события Page_Load.Мои исследования привели меня к следующему: 1. Событие Page_Init вызывается 2. Событие Page_Load вызывается 3. Переменные формы страницы читаются и обрабатываются (не уверен, какое событие) 4. Вызываются пользовательские события, т.е.: OnClick 5. Вызывается событие Pre_Rendered.

Мне нужно иметь возможность создать событие, которое будет вызываться после шага 3 и до или во время шага 4. Таким образом, я могу захватить значение TextBox и установить его значение в переменной PBUserControl.NVP, чтобы ономожно прочитать на главной странице.Если я вручную установлю значение в переменной PBUserControl.NVP, оно будет видно на главной странице и читается просто отлично.

Заранее спасибо.

1 Ответ

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

Я понял это !!!! По сути, я создал событие и передал его из динамически загруженного UserControl в основной UserControl. Ниже приведены изменения, которые я сделал, чтобы заставить его работать. Краткое объяснение, чтобы каждый мог следить за тем, как это работает. У меня есть внешняя оболочка под названием PBUserControl, которая позволяет мне создавать некоторые элементы путем наследования. Идея состоит в том, чтобы позволить мне передавать данные назад и вперед и, по-видимому, событие. При динамической загрузке дочернего элемента управления вам больше не предоставляется роскошь простого связывания элементов или событий. Класс PBUserControl создает общую связь, которая позволяет этому работать. Для моих целей это настройка для идеальной работы с настройкой структуры данных на бэкэнде. Таким образом, внесение изменений будет необходимо, чтобы он работал на вас. Но это должно оказаться легко понятным понятием.

Я могу зарегистрировать действие в динамическом элементе управления для ControlSubmittedHandler, расположенного в PBUserControl.

Я могу зарегистрировать действие из динамического элемента управления в родительском элементе управления, назначив ControlSubmittedHandler через ControlSubmittedDelegate в локальное событие. В этот момент я могу вызвать это событие.

Достаточно объяснения, вот изменения кода, чтобы он заработал:

Я добавил следующее к классу PBUserControl:

public delegate void ControlSubmittedDelegate(object sender, EventArgs e);
public System.EventHandler ControlSubmittedHandler;

В моем динамически загружаемом элементе управления я изменил событие Page_Load на:

protected void Page_Load(object sender, EventArgs e)
{
    InitializeControl();
    this.ControlSubmittedHandler = new EventHandler(ControlSubmittedAction);
}

В моем динамически загружаемом элементе управления я добавил:

public void ControlSubmittedAction(object sender, EventArgs e)
{
    ProcessSubmit();
}

В рамках моего основного контроля я добавил:

private PBUserControl _PBUserControl;
private event PBUserControl.ControlSubmittedDelegate myEvent;

В пределах моего основного контроля я изменил:

protected void MenuGroupRadMenu_Clicked(object sender, EventArgs e)
{
    myEvent = new PBUserControl.ControlSubmittedDelegate(_PBUserControl.ControlSubmittedHandler);
    if (myEvent != null) myEvent(this, e);

    IList<PBUserControl.NVP> nvp = _PBUserControl.NameValuePairs;
}
...