现有一个页面 a.aspx 和一个用户控件 b.ascx用户控件中就一个文本框 TextBox1 和一个属性
public Text
{
  get
  {
    return TextBox1.Text;
  }
}现在在 a.aspx 中动态加载了用户控件
b ucb = (b)Page.LoadControl("b.ascx");
this.Panel1.Controls.Add(ucb);并且在 a.aspx 中有一个按钮 Button1,在按钮事件里取用户控件的属性值
Button1_Click
{
  Label1.Text = ucb.Text;
}但点击按钮后显示错误 "未将对象引用设置到对象的实例。"错误在出在用户控件 Text 属性的 reuturn TextBox1.Text; 这行。我把动态加载控件那段放在 Page_Load 和 OnInit 里都试过了,都是这个错误,要怎样才能实行我要的这个效果?谢谢

解决方案 »

  1.   

    where is this TextBox1? show your b.ascx? do you have something like<asp:TextBox id="TextBox1" runat="server" />?
      

  2.   

    TextBox1 是 b.ascx 中的,这是 b.ascx 的代码<%@ Control Language="c#" AutoEventWireup="false" Codebehind="ucTest.ascx.cs" Inherits="IDB.WebForm.ucTest" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>
    <asp:textbox id="TextBox1" runat="server"></asp:textbox>这是 b.ascx.cs 的代码namespace Web
    {
    using System;
    using System.Data;
    using System.Drawing;
    using System.Web;
    using System.Web.UI.WebControls;
    using System.Web.UI.HtmlControls; public class b: System.Web.UI.UserControl
    {
    protected System.Web.UI.WebControls.TextBox TextBox1; private void Page_Load(object sender, System.EventArgs e)
    {
    } public string Text
    {
    get
    {
    return this.TextBox1.Text;
    }
    set
    {
    this.TextBox1.Text = value;
    }
    } override protected void OnInit(EventArgs e)
    {
    InitializeComponent();
    base.OnInit(e);
    }

    private void InitializeComponent()
    {
    this.Load += new System.EventHandler(this.Page_Load); }
    #endregion
    }
    }
    谢谢
      

  3.   

    首先,我们应该达成一个共识。.aspx 和 .ascx文件都是继承于后台代码的类的。这说明.aspx 和 .ascx文件本身就是一个类,并且是继承后台代码的类的。所以,你在取值的时候,反了个错误。
    Button1_Click
    {
      Label1.Text = ucb.Text;
    }
    应该改为
    private void Button1_Click(object sender, System.EventArgs e)
    {
    this.Label1.Text = ((b)this.pnlShowText.Controls[0]).Text;
    }
      

  4.   

    it works fine with me, assume your code is in ucTest.dllb.ascx:
    <%@ Control Language="c#" AutoEventWireup="false" Inherits="Web.b" TargetSchema="http://schemas.microsoft.com/intellisense/ie5"%>
    <asp:textbox id="TextBox1" runat="server"></asp:textbox>
    a.aspx:
    <%@ Assembly Name="UcTest" %>
    <%@ Import Namespace="Web"  %>
    <form runat="server" id="form1">
    <asp:Button id="btn" runat="server" OnClick="ReadValue" />
    </form><script language="C#" runat="server">
    Web.b c;
    void Page_Load(Object sender, EventArgs e)
    {
      c = (Web.b )LoadControl("b.ascx");
      form1.Controls.Add(c);
    }void ReadValue(Object sender, EventArgs e)
    {
     Response.Write(c.Text);
    }
    </script>
      

  5.   

    谢谢大家,不过还是不行
    to: lfzx_1227(淋漓) 用这个方法还是提示一样的错误to: saucer(思归) 我不是单独将用户控件编译成一个dll,而是跟调用aspx页面放在一起。我做了单独的测试解决方案,下载地址在 http://221.130.4.164/WebApplication1.rar烦请大家帮我看一下,多谢!在线等
      

  6.   

    >>>我不是单独将用户控件编译成一个dll,而是跟调用aspx页面放在一起应该跟这个无关的,试着把我的ASPX的东西抄到你页面去
      

  7.   

    晕,确实是这样,改成思归这样的一个 aspx 的 sdk 方式就正常,用 codebehind 方式就不行
    但是我现在项目中全是 codebehind 方式,而且实际应用比这个复杂的多,用 sdk 方式实在是太不方便,能帮我看看 codebehind 方式要怎样修改才能运行吗?想想也很奇怪,我这个 codebehind 方式和 sdk 方式的代码都是一样的呀,为什么会有这个问题?多谢多谢!
      

  8.   

    已经尝试在 codebehind 方式下把能试的方式都试过了,还是报错,恳请帮忙,多谢!
      

  9.   

    in WebForm1.aspx.cs, change
    WebUserControl1 uc = (WebUserControl1)Page.LoadControl("WebUserControl1.ascx");
    this.PlaceHolder1.Controls.Add(uc);==>uc = (WebUserControl1)Page.LoadControl("WebUserControl1.ascx");
    this.PlaceHolder1.Controls.Add(uc);