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

C# 如何从动态加载的用户控件访问post值,c#,.net,events,event-handling,C#,.net,Events,Event Handling,我在动态加载的用户控件上有一个基本的文本框。我知道了如何将值推送到这个文本框。我遇到的问题是,我无法从此文本框中获取输入的值 我必须创建一个类来向/从动态加载的控件传递变量。我称之为PBUserControl public class PBUserControl : UserControl { public IList<NVP> NameValuePairs { get { return _NameValuePairs; } } public class NVP

我在动态加载的用户控件上有一个基本的文本框。我知道了如何将值推送到这个文本框。我遇到的问题是,我无法从此文本框中获取输入的值

我必须创建一个类来向/从动态加载的控件传递变量。我称之为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 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;
    }
}
公共部分类PageAddEdit:PageBase
{
专用PBUserControl PBUserControl;
受保护的无效页面加载(对象发送方、事件参数e)
{
//必须始终在这里设计控件,否则它将消失。
Control TemplateUserControl=LoadControl(“~/Administrator/PageBuilder/Templates/Basic.ascx”);
_PBUserControl=(PBUserControl)TemplateUserControl;
_PBUserControl.AddNameValuePair(“TestContent”,“它正在工作!!!!!!!”);
_PBUserControl.AddNameValuePair(“测试”,“一些测试文本”);
Template.Controls.Add(TemplateUserControl);
}
已单击受保护的无效菜单组菜单(对象发送者,事件参数e)
{
IList nvp=_PBUserControl.NameValuePairs;
}
}
让我解释一下这里发生了什么。我可以从主页面设置PBUserControl中的值。它完美地传递到动态加载的用户控件中。做它应该做的事。工作得很好

但是,在处理回发变量之前,将触发动态加载控件中的page_load事件。因此,此时文本框的内容甚至还没有被读取。我通过研究发现了这一点。此外,如果我在动态加载的控件中放置一个Pre_呈现的事件,我可以在使用调试器单步执行代码时看到文本框的值。此外,通过调试器,我可以看到文本框在页面加载事件期间不会被读取。我的研究得出以下结论: 1.调用Page_Init事件 2.调用页面加载事件 3.读取和处理页面表单变量(不确定是什么事件) 4.用户事件称为ie:OnClick 5.调用预渲染事件

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


提前谢谢。

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

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

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; }
    }
}
我能够通过ControlSubmittedLegate将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;
在我的主要控制范围内,我添加了:

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;
}
已单击受保护的无效菜单组菜单(对象发送者,事件参数e)
{
myEvent=新的PBUserControl.ControlSubmittedLegate(\u PBUserControl.ControlSubmittedHandler);
如果(myEvent!=null)myEvent(this,e);
IList nvp=_PBUserControl.NameValuePairs;
}