asp.net动态加载Ascx控件问题解决日记

        在网上看了不少如何处理动态加载用户控件的文章,都没有解决我今天在开发中遇见的问题,

只好自己来了 ,问题后来自己解决了,发出来给大家分享一下! 也许对其他人有用,当时的情况是这样的.

        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

 }
}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值