如何从一个动态加载的用户控件

问题描述:

访问后值我有一个用户控件我动态加载基本文本框。我想出了如何将值推送到此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变量中手动设置一个值,它会在主页面看到并且读取得很好。

在此先感谢。

我想通了!!!!基本上我创建了一个事件并将其从动态加载的用户控件传递给主用户控件。以下是我为了实现它所做的更改。快速解释,让每个人都可以跟随它如何工作。我有一个名为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; 
} 
+0

非常漂亮!做得好 – Andrew 2012-03-12 21:38:26