当前位置:编程学习 > C#/ASP.NET >>

急,,,,怎样给用户控件里的自定义属性赋值??

在一个ASPX页中调用了一个用户控件ASCX,,用户控件中定义了三个字符串的属性,代码如下:
public partial class webs_reply : System.Web.UI.UserControl
{
    private string _kk;
    private string _vv;
    private string _tname;
    public string kk
    {
        set
        {
            _kk = value;
        }
        get
        {
            return _kk;
        }
    }
    public string vv
    {
        set
        {
            _vv = value;
        }
        get
        {
            return _vv;
        }
    }
    public string tname
    {
        set
        {
            _tname = value;
        }
        get
        {
            return _tname;
        }
    }
    protected void Page_Load(object sender, EventArgs e)
    {
                 Response.Write("select uname,uptime,content from " + tname + " where " + kk + "=" + vv + " order by uptime desc");
            Response.End();
          }

    }

在ASPX。CS页中这样给它们赋值:
public partial class webs_show_es : System.Web.UI.Page
{
    protected webs_reply c1 = new webs_reply();
    
    protected void Page_Load(object sender, EventArgs e)
    {
            c1.kk = "sid";
            c1.vv = sid;
            c1.tname = "rhb_es_reply";
          }
}

可是运行后显示出来的这三个值都是空的,,不知道为什么。。。。。 --------------------编程问答-------------------- 用户控件的Page_Load比它所在窗体的Page_Load先运行

就是这样 --------------------编程问答-------------------- Response.Write("select uname,uptime,content from " + tname + " where " + kk + "=" + vv + " order by uptime desc");
Response.End();

你可以把这几句话搬到PreRender()里
--------------------编程问答-------------------- 对了,,我用的是VS2005 --------------------编程问答-------------------- 晕了,,
 protected void Page_PreRender(object sender, EventArgs e)
    {
        Response.Write("select uname,uptime,content from " + tname + " where " + kk + "=" + vv + " order by uptime desc");
        Response.End();
    }
放到这里还是取不到值。。。。。 --------------------编程问答-------------------- 代码已经全贴出来了,,大佬们帮帮我啊。。。。。。。。。。 --------------------编程问答-------------------- 直接在html里,引用此控件处写
<uc1:WebUserControl ID="WebUserControl1" runat="server" _kk="aa" _vv="bb" />
就好了 --------------------编程问答-------------------- public string tname
    {
        set
        {
            _tname = value;----改成value=_tname就可以了
        }
        get
        {
            return _tname;
        }
    } --------------------编程问答-------------------- protected webs_reply c1 = new webs_reply();

错误!

不要赋值

声明一下protected webs_reply c1;
即可 --------------------编程问答-------------------- 还要确保

窗体的html代码里webs_reply控件的id="c1" --------------------编程问答-------------------- 在引用用户控件的页面 手动声明该控件
protected 命名空间.命名空间.类名 用户控件的id值; 
不用new就可以了 --------------------编程问答-------------------- 你的代码有几个问题:

1. "protected webs_reply c1 = new webs_reply();"这个写的真的没道理!webs_reply只是用户控件的父类(你看你的ascx的生命上写着inherit呢吧),而不是用户控件本身。

2. 用户控件要动态产生就应该用页面的LoadControl方法装入。例如:

  webs_reply uc=(webs_reply)this.LoadControl("webs_reply.ascx");
  uc.kk="aa";

3. 控件只有装入页面控件树,才可能真正找得到正确的Response对象。

4. 一般来说你在动态装载的控件的load事件中处理业务逻辑会得到错误的结果。不过你这个例子恰好流程异常简单,即使写错了地方,结果也不会出错。就好像有些去上厕所如果走错了门,只要后边根本没有人进来,你也不会感到有什么不方便。当你的程序要处理状态、处理post值、业务处理等的时候,就会发现必须把业务逻辑代码放到准确的事件上。 --------------------编程问答-------------------- 我顶楼上的 --------------------编程问答-------------------- 谢谢SP1234,,你的意思是我的代码没有写到正确的事件里吗??是用户控件里还是调用页里不对??

以上的方法我都试了,除了这个: _tname = value;----改成value=_tname就可以了

真的没有办法了,,恳请大侠们再帮我一把,,究竟错在哪了,,有人能帮我写一个对的出来吗》》
--------------------编程问答-------------------- 先将用户控件webs_reply对其自身成员的输出移动到PreRender内,然后——

如果:
1-------------------------------------------------
窗体的html代码中包含了用户控件webs_reply的引用,则:
*在窗体的后台代码类定义中加入声明:protected webs_reply c1;
*在Page_Load中按原样访问

2-------------------------------------------------
窗体的html代码中并不包含了用户控件webs_reply的引用,而是在窗体的后台代码中手动添加此控件,则:
*在窗体的后台代码类定义中加入声明:protected webs_reply c1;
*在窗体的Page_Load中为c1的属性赋值之前创建其对象:c1 = new webs_reply();
*在赋值后,添加代码:this.Control.Add(c1); --------------------编程问答-------------------- 谢谢SP1234,,你的意思是我的代码没有写到正确的事件里吗??是用户控件里还是调用页里不对??
——————————————————————————————————————————
我前三条是针对的你的逻辑错误,你的程序表现就错了。如果你前三天改好,后一条恰好不用改。你的代码:

   protected webs_reply c1 = new webs_reply();
    
    protected void Page_Load(object sender, EventArgs e)
    {
            c1.kk = "sid";
            c1.vv = sid;
            c1.tname = "rhb_es_reply";
          }
}

看上去你并没有研究页面的load如何会调用c1控件的load的。 --------------------编程问答-------------------- xujunsweet() 正解

SP1234分析的比较透彻

都是牛人呀 --------------------编程问答-------------------- 用户  xujunsweet() 

直接在html里,引用此控件处写
<uc1:WebUserControl ID="WebUserControl1" runat="server" _kk="aa" _vv="bb" />
就好了


是错误的

正确应该如下:

直接在html里,引用此控件处写
<uc1:WebUserControl ID="WebUserControl1" kk='aa' ,vv='bb',tname='name'   runat="server" />
就好了

在ASPX。CS页中需要给它们赋值了 --------------------编程问答-------------------- 更正
在ASPX。CS页中不需要给它们赋值了
--------------------编程问答-------------------- 你在实例化那个自定义控件时 打ASP.看看能不能看到那个自定义控件名称 
如果没有 在html中写<register >之类的东西 再运行一下 估计就可以了
我做了6。7个自定义控件都好用的 
可惜我的代码没在这 要不我给你发些 --------------------编程问答-------------------- public string kk
    {
        set
        {
            ViewState["kk"] = value;
        }
        get
        {
            return ViewState["kk"].ToString();
        }
    }
--------------------编程问答-------------------- 另:就象楼上说的,动态创建你必须把控件加入控件树中才能有显示 --------------------编程问答-------------------- 只要你有钱,生活就多姿多彩,并且每人问你钱是怎么来的
日本松下有一位高官说过:即使我们不去拜靖国神社韩国人也不会买我们的产品,但不管我们再怎样的去拜靖国神社,中国人照样会买我们的产品。----- 一句让中国人从头凉到脚的话。 每直接或间接地购买100元日本货,你就: 1.为日本厂家增加40元的毛利收入 2.为日本企业增加了20元的扩张资本 3.为日本政府增加了5元的税收收入 4.给日本的所谓自慰队增加了 10颗子弹 5.多印6~8页的篡改历史的教科书和文件 6.送给小犬蠢一狼参拜鬼社的汽油费 **。如果你买日本汽车,将来开上中国街头的日本坦克就是你造的!! **。如果你买日本橱具,将来射穿你儿子头颅的子弹就是你造的!! **。如果你买日本电视音响,将来就会在战地喇叭中听到中国人被杀的哀鸣!!!我们没有时间和权力去采取政治行动,我们只能作力所能及的事,拒买日货是我们对付日本人的最好行动,不但简单而且有效.我每天上网必做的一件事就是把此这篇文章贴到可能的地方,只要上网,我至少要贴上10次!!!作为一个有良知的中国人,来和我和许多爱国人士一起并肩战斗吧!! 请把此文贴到一切可能的地方,你一定会为你的所作所为而自豪 --------------------编程问答-------------------- 在html最上面添加:
<%@ Register TagPrefix="Tag" TagName="Title" Src="webs_reply.ascx" %>

在Form中引用:
<form id="Form1" method="post" runat="server">
<Tag:Title id="m_TitleControl" runat="server"/>]

然后在画面初期化时,对属性赋值
m_TitleControl.KK = value
......
(m_TitleControl要先声明)
--------------------编程问答-------------------- 该回复被版主删除 --------------------编程问答--------------------         
        webs_reply  c1 = (webs_reply)this.FindControl("MyControl1");

        c1.kk = "sid ";
        c1.vv = "sid";
        c1.tname = "rhb_es_reply ";  --------------------编程问答-------------------- 觉得主要问题是 protected   webs_reply   c1   =   new   webs_reply(); 这个是完全没有必要的。

补充:.NET技术 ,  ASP.NET
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,