如何从动态加载的用户控件中访问post值

时间:2012-03-05 14:09:02

标签: c# .net events event-handling

我在用户控件上有一个基本的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的值。此外,使用调试器,我可以看到在Page_Load事件期间未读取TextBox。我的研究告诉我以下内容: 1.调用Page_Init事件 2.调用Page_Load事件 3.页面表单变量被读取和处理(不确定是什么事件) 4.用户事件被称为:OnClick 5.调用Pre_Rendered事件。

我需要能够创建一个将在步骤3之后以及步骤4之前或期间调用的事件。这样我就可以捕获TextBox值并在PBUserControl.NVP变量中设置它的值,以便可以通过主页面。如果我在PBUserControl.NVP变量中手动设置一个值,主页就可以看到它并且读得很好。

提前致谢。

1 个答案:

答案 0 :(得分:0)

我想通了!!!!基本上我创建了一个事件,并将它从动态加载的UserControl传递给Main UserControl。以下是我为使其发挥作用所做的更改。快速解释,这样每个人都可以按照它的工作原理。我有一个名为PBUserControl的外包装器,它允许我通过继承创建一些元素。背后的想法是允许我来回传递数据,显然是一个事件。当动态加载子控件时,您不再能够轻松地绑定元素或事件。 PBUserControl类创建一个允许它工作的公共绑定。出于我的目的,它的设置理想地适用于如何在后端设置数据结构。因此,需要进行调整才能使其适用于您。但这应该被证明是一个易于理解的概念。

我能够将动态控件中的动作注册到位于PBUserControl中的ControlSubmittedHandler。

我能够通过ControlSubmittedDelegate将ControlSubmittedHandler分配到本地事件中,从父控件中的动态控件注册动作。那时我能够触发那个事件。

足够的解释,这里是代码更改,使其工作:

我将以下内容添加到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;
}