用户控件WebUserControl1.ascx
调用页面:test.aspx
想实现:把test.aspx中的一个string的值传给WebUserControl1.ascx,WebUserControl1.ascx上用一个label把这个值显示出来
WebUserControl1.ascx中定义属性:
private string _test;
public string test
{
get
{
return _test;
}
set
{
_test = value;
}
}
WebUserControl1.ascx中加一个button,onclick事件下写
private void Button1_Click(object sender, System.EventArgs e)
{
Label1.Text = this.test;
}
test.aspx下
private void Page_Load(object sender, System.EventArgs e)
{
WebUserControl1 uc = new WebUserControl1();
uc.test = "test";
}
这种情况下点击button,Label1并没有取道test页面传过来的值,但是设断点跟踪_test = value一句是取到值了的。这是通过test页面后台代码传递参数的情况,用前台HTML中添加属性的方法就可以成功。请问上面用后台传递的方法哪里出了问题?查了一些帖子,说
public string test
{
get
{
return Label1.Text;
}
set
{
Label1.Text = value;
}
}
这样处理也可以,但是执行时会报“未将对象设置到实例”的错误请问这种方式的正确的使用办法就这个传递参数的小问题,折腾了几个小时了,还没有结果,佛曰“人有二十难”,这个应该算是我的其中之一了,杀会人,然后睡觉,明天早上来解贴!!!没有比这简单的问题了,来抢分吧

解决方案 »

  1.   

    private void Page_Load(object sender, System.EventArgs e)
    {
    if(!Page.IsPostBack)//加这个
    {
    WebUserControl1 uc = new WebUserControl1();
    uc.test = "test";
    }
    }
      

  2.   

    抢!WebUserControl1.ascx放到test.aspx上
    WebUserControl1.ascx的id为webUserControl1则在后台加上声明(假如在同一命名空间)(关键)
    protected WebUserControl1 webUserControl1;private void Page_Load(object sender, System.EventArgs e)
    {
    webUserControl1.test = "test";
    }
      

  3.   

    to singlepine
    在调用页面里按你的方法做了,效果一样,在调用页面加ispostback的判断有用吗?to ofei
    这种声明我之前就试过,在赋值webUserControl1.test = "test"这一句会报
    未将对象引用设置到对象的实例,控件和调用页面在同一命名空间下,但是不用目录还有谁回答一下怎么直接在属性中赋值给Label1难道我的.net有问题?
      

  4.   

    直接命名成static变量不行吗
    没怎么用过asp.net  =.=
      

  5.   

    在前台页面放置一个用户定义控件WebUserControl1.ascx,假设ID为"webUserControl1"
    在后台中添加下面的语句
    protected WebUserControl1 webUserControl1;      // 与前台定义的ID 同名private void Page_Load(object sender, System.EventArgs e)
    {
        if( ! this.IsPostBack )
        {
              //实例化一个对象,用以与前台定义的对象对应
            webUserControl1 = new WebUserControl1(); 
        }    webUserControl1.test = "test";
    }
      

  6.   

    直接在属性中赋值给Label1:
    方法1:
    假设你前台页面是用webUserControl1做用户控件的id的
    (webUserControl1.FindControl("Label1") as Lable).Text = "#####";
      

  7.   

    方法2:
    修改 WebUserControl1.ascx中定义属性:public string test
    {
    get
    {
    return Lable1.Text;
    }
    set
    {
    Lable1.Text = value;
    }
    }
      

  8.   

    private void Button1_Click(object sender, System.EventArgs e)
    {
    Label1.Text = this._test;
    }
      

  9.   

    方法1;
    在自定义控件里声明一个全局变量如;public string parentID="";
    在test.aspx里声明控件时同时赋值如
    <uc1:webUserControl1 id="MyControl1" runat="server" parentID=“XXX”></uc1:MyControl>
    方法2:
    在test.aspx.cs中
    webUserControl innerControl= (webUserControl)e.Item.FindControl("MyControl1");
    innerControl.test = "XXXXXX";
    在自定义控件里
    private string _test;
    public string test
    {
    get
    {
    return _test;
    }
    set
    {
    _test = value;
    }
    }
      

  10.   

    方法2是最常规最推荐的做法,执行时会报“未将对象设置到实例”的错误,是你自己的代码问题.请检查哪句出这个错了,然后从那句找原因.
    报错的语句是:
    Lable1.Text = value;
      

  11.   

    方法1:
    假设你前台页面是用webUserControl1做用户控件的id的
    (webUserControl1.FindControl("Label1") as Lable).Text = "#####";protected uctest uc;
    private void Page_Load(object sender, System.EventArgs e)
    {
    // 在此处放置用户代码以初始化页面
    //uctest uc = new uctest();
    (uc.FindControl("Label1") as Label).Text = "sdfasdf";
    }
    (uc.FindControl("Label1") as Label).Text = "sdfasdf";
    这句报“未将对象设置到实例”
      

  12.   

    private void Button1_Click(object sender, System.EventArgs e)
    {
    Label1.Text = this._test;
    }效果是一样的,还是取不到值
      

  13.   

    做属性的话,应使用viewstate
            public string Text
            {
                get
                {
                    String s = (String)ViewState["Text"];
                    return ((s == null) ? String.Empty : s);
                }            set
                {
                    ViewState["Text"] = value;
                }
            }
      

  14.   

    private WebUserControl1 uc = new WebUserControl1();private void Page_Load(object sender, System.EventArgs e)
    {
    uc.test = "test";
    }
    你写的Label1.Text = this.test;能执行过去??换成Label1.Text = uc.test;