在网上看了不少如何处理动态加载用户控件的文章,都没有解决我今天在开发中遇见的问题,
只好自己来了 ,问题后来自己解决了,发出来给大家分享一下! 也许对其他人有用,当时的情况是这样的.
Web项目有3个ascx控件,Header.ascx,HeaderFree.ascx,HeaderLogin.ascx
在网页上只放Header.ascx控件,Header.ascx根据用户是否登陆,来决定是加载HeaderFree.ascx
还是HeaderLogin.ascx.
HeaderLogin.ascx和HeaderFree.ascx里面都有一个GetCityName()的方法,都有一个控件
cmbCityRegion(RKWebControl1.1控件集的下拉控件),用来保存城市信息.GetCityName()用来获
取用户控件中的cmbCityRegion当前选中的城市名称.
我需要在ClubList.aspx里面引用Header.ascx,开始弄了半天把Header.ascx对象实例子化
的时候,总是异常提示动态加载生成的用户控件为空,看了半天网上转载的文章都无法解决.后来
发现在动态加载ascx控件的时候,ascx控件的Page_Load方法居然是在调用页面aspx的Page_Load
之后才执行的,那么是不是我原来把动态加载的一些处理语句写在Page_Load里面的问题呢,
我换了一下,把原来写在Page_Load里面的语句写到OnInit(EventArgs e)函数里面去!调试后
问题解决! 瞎摆弄一下,有时候问题就这么简单.不要迷信别人转帖的文章!
请多多支持作者作品RKWeb1.1 asp.net开发模板!
有效提高asp.net开发效率60%以上的代码框架!
类似java的struts+spring+hirbenate
下载地址:www.hositech.com
转帖全部代码如下:
ClubList.aspx:
using System;
using System.Configuration ;
using System.Collections;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Web;
using System.Web.SessionState;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using AspnetTemplate;
using Ajax;
using RKWebControl.Controls;
using DiyLibrary;
namespace SportDiyWeb.Club
{
/// <summary>
/// ClubList 的摘要说明。
/// </summary>
public class ClubList : System.Web.UI.Page
{
protected System.Web.UI.WebControls.DataGrid dgViewClub;
protected RKWebControl.Controls.CSWITComboBox cmbSportID;
protected RKWebControl.Controls.CSWITTextEdit txtKey;
protected RKWebControl.Controls.CSWITButton btnSearch;
protected System.Web.UI.HtmlControls.HtmlForm frmMain;
protected System.Web.UI.WebControls.Label LabRecord;
protected System.Web.UI.WebControls.Label LabPageCount;
protected System.Web.UI.WebControls.Label labCurPage;
protected System.Web.UI.HtmlControls.HtmlGenericControl myBody;
//定义模板对象
public GCtlFun comGCtlFun;
public GFunction comGFunction;
public AccessCTL comAccessCTL;
private void Page_Load(object sender, System.EventArgs e)
{
//实例化模板对象
comGCtlFun=new GCtlFun();
comAccessCTL=new AccessCTL(this);
comGFunction=new GFunction();
// 在此处放置用户代码以初始化页面
if(!Page.IsPostBack )
{
InitForm();
}
}
private void InitForm()
{
DiyLibrary.Club objClub=new DiyLibrary.Club();
objClub.FillSportDropDown(ref cmbSportID);
GetQueryResult(txtKey.Text );
}
#region 查询记录
/// <summary>
/// 获取查询结果
/// </summary>
/// <param name="strKey"></param>
private void GetQueryResult(string strKey)
{
//获取窗体的地区信息
Ascx.Header ascxHeader=(Ascx.Header)this.Page.FindControl("Header1");
string strCity="";
strCity=ascxHeader.GetCityName();
DiyLibrary.Club objClub=new DiyLibrary.Club();
//根据传来的ClubID,获取俱乐部信息
DataSet dstClub=objClub.GetClubInfo(strKey,cmbSportID.SelectedKey,strCity);
//显示信息
dgViewClub.DataSource=dstClub;
dgViewClub.DataBind();
if(dstClub.Tables[0].Rows.Count>0)
{
labCurPage.Text=(dgViewClub.CurrentPageIndex+1).ToString();
LabPageCount.Text=dgViewClub.PageCount.ToString();
LabRecord.Text=dstClub.Tables[0].Rows.Count.ToString();
}
else
{
labCurPage.Text="0";
LabPageCount.Text="0";
LabRecord.Text="0";
}
}
private void btnSearch_Click(object sender, System.EventArgs e)
{
dgViewClub.CurrentPageIndex=0;
GetQueryResult(txtKey.Text);
}
#endregion
#region DataGrid处理
private void dgViewClub_PageIndexChanged(object source, System.Web.UI.WebControls.DataGridPageChangedEventArgs e)
{
dgViewClub.CurrentPageIndex=e.NewPageIndex;
InitForm();
}
private void dgViewClub_ItemDataBound(object sender, System.Web.UI.WebControls.DataGridItemEventArgs e)
{
Label lblClubID=(Label)e.Item.FindControl("lblClubID");
Literal ltlGrade=(Literal)e.Item.FindControl("ltlGrade");
Literal ltlLogo=(Literal)e.Item.FindControl("ltlLogo");
if(lblClubID!=null && ltlGrade!=null && ltlLogo!=null)
{
DataSet dstData=new DataSet();
dstData=(DataSet)dgViewClub.DataSource;
//等级,Logo显示
if(dstData.Tables[0].Rows[e.Item.ItemIndex]["GradeID"].ToString()!="0")
{
string strStar="";
for(int i=0;i<int.Parse(dstData.Tables[0].Rows[0]["GradeID"].ToString());i++)
{
strStar=strStar+"<img src='/images/star.gif'>";
}
ltlGrade.Text="俱乐部等级:"+strStar;
}
if(dstData.Tables[0].Rows[0]["Logo"].ToString()!="")
{
string strClubPath=ConfigurationSettings.AppSettings["ClubLogo"].ToString();
ltlLogo.Text="<img src='"+strClubPath+"/"+dstData.Tables[0].Rows[0]["Logo"].ToString()+"' width=100 height=50>" ;
}
}
}
#endregion
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器修改
/// 此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.btnSearch.Click += new System.EventHandler(this.btnSearch_Click);
this.dgViewClub.PageIndexChanged += new System.Web.UI.WebControls.DataGridPageChangedEventHandler(this.dgViewClub_PageIndexChanged);
this.dgViewClub.ItemDataBound += new System.Web.UI.WebControls.DataGridItemEventHandler(this.dgViewClub_ItemDataBound);
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
Header.ascx:
namespace SportDiyWeb.Ascx
{
using System;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
/// <summary>
/// Header 的摘要说明。
/// </summary>
public class Header : System.Web.UI.UserControl
{
public Control ctlHeader;
string strCity="";
private void Page_Load(object sender, System.EventArgs e)
{
}
public string GetCityName()
{
if (Context.Request.IsAuthenticated == true)
{
Ascx.HeaderLogin AcxLogin=(Ascx.HeaderLogin)this.FindControl("DIYHeader") ;
strCity=AcxLogin.GetCityName();
}
else
{
Ascx.HeaderFree AcxFree=(Ascx.HeaderFree)this.FindControl("DIYHeader") ;
strCity=AcxFree.GetCityName();
}
return strCity;
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
//根据用户是否登陆的状态Load不同的Ascx
if (Context.Request.IsAuthenticated == true) //验证过的用户才进行role的处理
{
ctlHeader=LoadControl("/Ascx/HeaderLogin.ascx");
}
else
{
ctlHeader=LoadControl("/Ascx/HeaderFree.ascx");
}
ctlHeader.ID="DIYHeader";
this.Controls.Add(ctlHeader);
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
HeaderFree.ascx:
namespace SportDiyWeb.Ascx
{
using System;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using DiyLibrary;
/// <summary>
/// HeaderFree 的摘要说明。
/// </summary>
public class HeaderFree : System.Web.UI.UserControl
{
protected RKWebControl.Controls.CSWITLabel lblRegionID;
protected RKWebControl.Controls.CSWITComboBox cmbCityRegion;
protected RKWebControl.Controls.CSWITLabel CSWITLabel1;
private void Page_Load(object sender, System.EventArgs e)
{
}
/// <summary>
/// 获取当前城市名称
/// </summary>
/// <returns></returns>
public string GetCityName()
{
if(cmbCityRegion.Items[cmbCityRegion.SelectedIndex].ToString().Trim().Length>0)
{
if(cmbCityRegion.Items[cmbCityRegion.SelectedIndex].ToString().Trim().Substring(0,1)!="-")
{
return cmbCityRegion.Items[cmbCityRegion.SelectedIndex].ToString().Trim();
}
else
{
return "";
}
}
else
{
return "";
}
}
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
if(!Page.IsPostBack )
{
DiyLibrary.Club objClub=new DiyLibrary.Club();
objClub.FillCityRegion(ref cmbCityRegion);
}
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}
HeaderLogin.ascx:
namespace SportDiyWeb.Ascx
{
using System;
using System.Data;
using System.Drawing;
using System.Web;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;
using System.Web.Security;
using System.Security.Principal;
using RKWebControl.Controls;
/// <summary>
/// HeaderLogin 的摘要说明。
/// </summary>
public class HeaderLogin : System.Web.UI.UserControl
{
protected RKWebControl.Controls.CSWITLabel lblUserInfo;
protected System.Web.UI.HtmlControls.HtmlTableCell tdUser;
protected RKWebControl.Controls.CSWITLabel lblRegionID;
protected RKWebControl.Controls.CSWITComboBox cmbCityRegion;
private void Page_Load(object sender, System.EventArgs e)
{
string strUserName=GetUserName();
if(strUserName.Trim()!="")
tdUser.InnerHtml="当前用户:<font color=red>"+strUserName+"</font>";
else
Response.Redirect("/Login.aspx",true);
}
#region 系统公用函数
/// <summary>
/// 获取当前登录用户的ID
/// </summary>
/// <returns></returns>
public string GetUserID()
{
FormsIdentity Id = (FormsIdentity)Context.User.Identity ;
FormsAuthenticationTicket Ticket = Id.Ticket ; //取得身份验证票
string[] strUserData = Ticket.UserData.Split ('|') ; //将身份验证票中的用户数据转成字符串数组
return strUserData[2];
}
/// <summary>
/// 获取当前城市名称
/// </summary>
/// <returns></returns>
public string GetCityName()
{
if(cmbCityRegion.Items[cmbCityRegion.SelectedIndex].ToString().Trim().Length>0)
{
if(cmbCityRegion.Items[cmbCityRegion.SelectedIndex].ToString().Trim().Substring(0,1)!="-")
{
return cmbCityRegion.Items[cmbCityRegion.SelectedIndex].ToString().Trim();
}
else
{
return "";
}
}
else
{
return "";
}
}
/// <summary>
/// 获取当前登录用户的名称
/// </summary>
/// <returns></returns>
public string GetUserName()
{
FormsIdentity Id = (FormsIdentity)Context.User.Identity ;
FormsAuthenticationTicket Ticket = Id.Ticket ; //取得身份验证票
string[] strUserData = Ticket.UserData.Split ('|') ; //将身份验证票中的用户数据转成字符串数组
return strUserData[1];
}
#endregion
#region Web 窗体设计器生成的代码
override protected void OnInit(EventArgs e)
{
if(!Page.IsPostBack )
{
DiyLibrary.Club objClub=new DiyLibrary.Club();
objClub.FillCityRegion(ref cmbCityRegion);
}
//
// CODEGEN: 该调用是 ASP.NET Web 窗体设计器所必需的。
//
InitializeComponent();
base.OnInit(e);
}
/// <summary>
/// 设计器支持所需的方法 - 不要使用代码编辑器
/// 修改此方法的内容。
/// </summary>
private void InitializeComponent()
{
this.Load += new System.EventHandler(this.Page_Load);
}
#endregion
}
}