2011-04-09 40 views
0
  1. 我有一个UpdatePanel。
  2. 我在这个UpdatePanel中有一个PlaceHolder。
  3. 有许多UserControls。其中一个将被动态加载, 根据一些选择。如何在这种情况下访问UserConrtorl的控件

    Control mycontrol = this.Page.LoadControl("myusercontrol.ascx"); 
    myplaceholder.Controls.Add(mycontrol); 
    
  4. 加载特定的用户控件后,我希望得到书面的 一个TextBox是从父页面加载的用户控件的文本。

    TextBox mytextbox = (TextBox) Page.FindControl("myusercontrol") 
        .FindControl("mytextbox"); 
    

问题是文本始终是空的!

我错过了什么? 我感谢您的帮助。

+0

可能您希望获得发布数据。我认为可能问题在于你添加了哪些控件。您需要在PageInit上甚至之前添加控件,并在Page_Load上请求它们。当你问他们内部的数据时,页面已经准备好通过这个获得并将它们放在控件上。 – Aristos 2011-04-09 18:23:08

+0

问题在于UserControl将在稍后加载,之后我单击一个按钮。然后,我将在放置在UserControl中的TextBox中写入一些内容。之后,我想从放置在父页面的另一个控件访问TextBox.text。所以我该怎么做 ? – HTB 2011-04-09 20:16:57

回答

0

当你说text is always empty,确实意味着TextBox对象为null或者字面意义上文本框的.Text为空?

请记住,在Web应用程序中,您必须回发到服务器以刷新结果并更新控件等等。

尝试发回服务器并查看是否有帮助。

+0

不,我可以得到TextBox对象。但.Text始终是空的。 – HTB 2011-04-09 20:18:46

+0

..其实我试图从服务器控件(Button)中获取.Text,所以有一个回发。 – HTB 2011-04-09 20:20:31

1

如前所述,您应该加载您的UserControl覆盖OnInit。为什么你看整个页面找到UserControl?您可以使用PlaceHolder.Controls ...

这我得到了它的工作

protected override void OnInit(EventArgs e) 
{ 
    Control userControl = this.Page.LoadControl("WebUserControl.ascx"); 
    testPlaceHolder.Controls.Add(userControl); 
    userControl.ID="id"; 
    base.OnInit(e); 
} 
protected void testButton_Click(object sender, EventArgs e) 
{ 
    Control testUserControl = (Control)testPlaceHolder.Controls[0]; 
    //Control testUserControl=(Control)testPlaceHolder.FindControl("id"); 
    TextBox mytextbox = (TextBox)testUserControl.FindControl("testTextBox"); 
    testButton.Text = mytextbox.Text; 
} 
+0

是的。而已 。您必须将其加载到OnInit或Page_Load中。我这样做后,一切都变得非常有光泽。 – HTB 2011-04-14 00:17:27

0

你有没有考虑增加一个属性,用户控件返回的文本?

如:

public class YourControl : UserControl 
{ 

    public string Text 
    { 
    get 
    { 
     return this.TextBox1.Text; 
    } 
    } 
} 
0

通常情况下,用户控件用于封装 - 你包的控制,在UC以便其他代码的行为等所有的细节没有处理它。

通过直接引用UC内的控件 - 通过名称或ID - 您打破了模型。我可以建议你不要这样做,而是如果你需要从UC获取信息,你可以添加一个容器可以调用的属性,事件或方法。

这样,如果您需要更改UC控件名称,类型,样式或其他逻辑以后使用 - 您只需要在UC中更改该属性/事件/方法,而不是在(例如)它可能在代码中使用了100个地方。

如果您可以让我们知道为什么您需要这些信息或关于该示例的更多具体细节,也许我们可以建议一些代码来实现此功能。

0

那么,我该怎么办?

只需手动获取发布的值。

Request.Form[yourcondeol.UniqueID] 

通过调试这个你可以看到所有的发布数据。

Request.Form