我在用户控件上有一个基本的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变量中手动设置一个值,主页就可以看到它并且读得很好。
提前致谢。
答案 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;
}