首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > asp.net >

用户控件有关问题:Aspx页面的Page_Load中无法获取通过静态添加的用户控件的属性值

2012-01-06 
用户控件问题:Aspx页面的Page_Load中无法获取通过静态添加的用户控件的属性值?ascx:publicstringddlProvin

用户控件问题:Aspx页面的Page_Load中无法获取通过静态添加的用户控件的属性值?
ascx:
public   string   ddlProvinceSelectText
        {
                get
                {
                        return   ddlProvince.SelectedItem.Text;
                }
                set
                {
                       
                        ddlProvince.SelectedItem.Text   =   value;
                }
        }
ddlProvince:一个DropDownList控件

aspx:
前端代码:
<uc1:AreaListl   ID= "AreaListl1 "   runat= "server "   ddlCityAutoPostBack= "true "   />
后台代码:
protected   void   Page_Load(object   sender,   EventArgs   e)
        {
                if   (!IsPostBack)
                {
                      AreaList1.ddlProvinceSelectText   =   "江西省 ";
               
                }

        }

报错:

未将对象引用设置到对象的实例。  
说明:   执行当前   Web   请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。  

异常详细信息:   System.NullReferenceException:   未将对象引用设置到对象的实例。

源错误:  


行   146:                 {
行   147:                        
行   148:                         ddlProvince.SelectedItem.Text   =   value;
行   149:                 }
行   150:         }
 

源文件:   e:\Cti_Soft\Cti_Web\UserControl\AreaListl.ascx.cs         行:   148  


注:属性设置肯定是正确的,因为我在页面中放一个BUTTON,将Page_Load中的代码放在Button_Click中则一切正常!


[解决办法]
public class youraspxpage:page
{
//加上下句
protected AreaListl AreaList1;
.. page_load(... )
   {}
}
[解决办法]
AreaList1 = (UserControl)Page.FindControl( "AreaList1 ");
[解决办法]
没有定义AreaList1 ?
也有可能你的用户控件没写对;
[解决办法]
这里应该在.cs中申明一次你的控件..

protected AreaListl AreaList1;

protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
AreaList1.ddlProvinceSelectText = "江西省 ";

}

}

[解决办法]


ddlProvince.SelectedItem.Text = value
控件中的dllProvice没找到
[解决办法]

ASCX的名词空间.ASCX里的类 dllProvince1 = (ASCX的名词空间.ASCX里的类)this.FindControls[ "你这个ASCX在你执行页面里的ID "]


dllProvince1 就是你这个控件拖到你页面里的对象了
[解决办法]
这个东东不会,顶。
[解决办法]
在页面添加引用你的控件

[DllImport( "dllProvice.dll ")]
public static extern bool Provice(int frequency, int duration);

下面类里面就可以调用了
[解决办法]
没有实例吧,自己的用户控件类也要实例呀
[解决办法]
wangzhaoli1982(做事最怕认真二字)
这个我都试过了,都不行

你加了using 你那个AXCS那个名词空间;
了吗?
[解决办法]
多一次操作吧,用变量保存Text的值
[解决办法]
感觉有问题...你 注册了没 ?
[解决办法]
((用户控件类)this.FinControl( "AreaList1 ")).ddlProvinceSelectText = "江西省 ";
要转成你用户控件的类,
[解决办法]
Page_Load 在加载的时候是第一步,就是说还没有加载你aspx页面的用户控件,你赋值所以会抱错。如果是在其它的函数里执行就不会有问题。就是让Page_Load走完。
[解决办法]
LZ:我按照你说,做了个DEMO,没发现你说的问题。

是比较怪的。。
[解决办法]
TO :LZ
if (!IsPostBack)的时候 错误

BUTTION事件里不错误:页面LOAD过后 没问题

你看下是不是,在这个页面加载的时候,DDL还没事例化
[解决办法]
首先,LZ的用户控件是否完全没有错误,建议查找ascx中是否有某些错误,如果
<uc1:AreaListl ID= "AreaListl1 " runat= "server " ddlCityAutoPostBack= "true " />
的uc1:AreaListl下出现波浪线,则说明该用户控件有错误,而导致无法正常引用,有可能出现此类错误
[解决办法]
没碰到过
[解决办法]
两个层次的解释:

首先,控件的基本原理如下代码所示。

public string ddlProvinceSelectText
{
get
{
EnsureChildControls();
return ddlProvince.SelectedItem.Text;
}
set
{
EnsureChildControls();
ddlProvince.SelectedItem.Text = value;
}
}

第二:尽管从原理上上面的代码是正确的,但是应该说是一种比较“小气、狭隘”的编程框架(方式)。不应该用控件来保存变量值。正确的控件的接口功能应该类似这样实现:

bool PropertyChanged=false;

public string ddlProvinceSelectText
{
get
{
if(ViewState[ "ddlProvince "]!=null)
return(string)ViewState[ "ddlProvince "];
else
return null;
}
set
{
ViewState[ "ddlProvince "]=value;
PropertyChanged=true;
}
}

接口属性只有到PreRender或者Render的时候才会更新到控件上(不能在set属性的时候去动控件),而从控件更新到属性则在控件的事件中处理。

热点排行