|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
我之所以想学。NET,是因为一直觉的BILLGATES好厉害,希望有一天能去微软,虽然现在还距离遥远,呵呵:)明天在asp.net背景经由过程Page.LoadControl办法增加用户控件后,发明用户控件中的OnInit中的事务没有实行,我们先看看我的用户控件中触及该成绩的代码:
///<summary>
///SDDropDownList范例,控件可依据之范例主动初始化下拉项
///</summary>
public_SourceTypeSourceType
{
get;
set;
}
protectedoverridevoidOnInit(EventArgse)
{
base.OnInit(e);
if(!IsPostBack)
{
DataBind_LocalDDL(SourceType);
}
}
publicvoidDataBind_LocalDDL(_SourceType_SourceType)
{
switch(_SourceType)
{
case_SourceType.Storage_Goods_Sort:
{
DDLDataBind(droplist,DictionaryBLL.GetModelList("DCID=002"));
break;
}
case_SourceType.Storage_Goods_GState:
{
DDLDataBind(droplist,DictionaryBLL.GetModelList("DCID=032"));
break;
}
……
}
privatevoidDDLDataBind(System.Web.UI.WebControls.DropDownListDDL,List<SDERP.Model.SysManage.Sys_Dictionary>DataSource)
{
ListItemItem=newListItem("--请选择--","");
DDL.DataValueField="DID";
DDL.DataTextField="Dname";
DDL.DataSource=DataSource;
DDL.DataBind();
DDL.Items.Insert(0,Item);
}
再看看我挪用页面中触及该成绩的代码:
protectedoverridevoidPage_Load(objectsender,EventArgse)
{
base.Page_Load(sender,e);
InitSearchPanel();
}
protectedvirtualvoidInitSearchPanel()
{
……
IControlsicontrols=(IControls)Page.LoadControl("~/Controls/SDDropDownList.ascx");
SDDropDownListiicontrol=icontrolsasSDDropDownList;
if(icontrols!=null)
{
SearchPanelID.Controls.Add(iicontrol);
if(!string.IsNullOrEmpty(dr["ControlSourceID"].ToString()))
{
iicontrol.SourceType=(Controls._SourceType)Enum.Parse(typeof(Controls._SourceType),dr["ControlSourceID"].ToString());
}
……
}
}
经反省后发明,成绩出在SearchPanelID.Controls.Add(iicontrol)这行代码中,在asp.net中,在背景静态增加的用户控件,其初始化事情是在用户控件被增加到页面上入手下手的,而不是在加载时入手下手。也就是说,我的用户控件在SearchPanelID.Controls.Add(iicontrol)这行代码后即刻入手下手初始化事情,也就是实行用户控件的OnInit办法,而在此时,用户控件的SourceType属性并没有赋值,也就是值为None,以是用户控件的DataBind_LocalDDL事务中,就不克不及为droplist主动加添下拉项了。
改写代码,将
if(!string.IsNullOrEmpty(dr["ControlSourceID"].ToString()))
{
iicontrol.SourceType=(Controls._SourceType)Enum.Parse(typeof(Controls._SourceType),dr["ControlSourceID"].ToString());
}
这段代码移到SearchPanelID.Controls.Add(iicontrol)之前,成绩办理。也就是:
protectedvirtualvoidInitSearchPanel()
{
……
IControlsicontrols=(IControls)Page.LoadControl("~/Controls/SDDropDownList.ascx");
SDDropDownListiicontrol=icontrolsasSDDropDownList;
if(icontrols!=null)
{
if(!string.IsNullOrEmpty(dr["ControlSourceID"].ToString()))
{
iicontrol.SourceType=(Controls._SourceType)Enum.Parse(typeof(Controls._SourceType),dr["ControlSourceID"].ToString());
}
SearchPanelID.Controls.Add(iicontrol);
……
}
}
总结:
1,我们在asp.net背景中静态增加用户控件时,在Page.LoadControl("控件地点")加载控件的时分,用户控件未被初始化,只要当用户控件增加到页面元素中时,才会入手下手初始化.
2,我们在开辟WebForm项目时,必定要分明懂得页面和控件的性命周期,才干在庞大的逻辑处置中做到不堕落。在经过全球个人PC市场占有90%的微软对asp.net不断优化与整合后,asp.net与微软自身平台的动用上更加的高效,加上asp.net在应用上非常容易上手,相信asp.net仍会是最多客户选用的脚本语言,并会在未来几年继续领跑。 |
|