如何从动态加载的用户控件访问post值
本文关键字:控件 访问 post 用户 动态 加载 | 更新日期: 2023-09-27 18:26:59
我在动态加载的用户控件上有一个基本的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.用户事件称为ie:OnClick5.调用Pre_Rendered事件。
我需要能够创建一个将在步骤3之后、步骤4之前或期间调用的事件。这样,我就可以捕获TextBox值,并在PBUserControl.NVP变量中设置它的值,以便主页面可以读取它。如果我在PBUserControl.NVP变量中手动设置一个值,它会被主页面看到,并且读取得很好。
提前谢谢。
我想通了!!!!基本上,我创建了一个事件,并将其从动态加载的UserControl传递给MainUserControl。以下是我为使其发挥作用所做的更改。快速解释,这样每个人都可以了解它的工作原理。我有一个名为PBUserControl的外部包装器,它允许我通过继承来创建一些元素。背后的想法是允许我来回传递数据,显然是一个事件。当动态加载子控件时,您不再能够轻松地绑定元素或事件。PBUserControl类创建了一个公共绑定,使其能够工作。就我的目的而言,它的设置理想地适用于如何在后端设置数据结构。因此,为了让它为你工作,需要进行调整。但这应该被证明是一个易于理解的概念。
我能够将动态控件中的操作注册到位于PBUserControl中的ControlSubmittedHandler。
我可以通过ControlSubmittedDelegate将ControlSubmittedTHandler分配到本地事件中,从而在父控件中注册来自动态控件的操作。在这一点上,我能够触发该事件。
足够的解释,以下是使其工作的代码更改:
我在类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;
}