首页 | 编程语言 | 网站建设 | 游戏天堂 | 冲浪宝典 | 网络安全 | 操作系统 | 软件时空 | 硬件指南 | 病毒相关 | IT 认证
软讯网络 > 编程语言 > .NET > C#.NET > asp.net动态加载用户控件问题解决日记
【标  题】:asp.net动态加载用户控件问题解决日记
【关键字】:asp.net
【来  源】:http://blog.csdn.net/hnwanghb/archive/2007/04/19/1570276.aspx

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

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

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

        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

 }
}

dropdownlist中----号的实现:【上一篇】
近期Windows相关的两本新书:【下一篇】
【相关文章】
  • 在PHP中使用ASP.NET AJAX
  • asp.net2.0 javascript 回调服务器端方法
  • Asp.Net Trace
  • 使用easyobjects asp.net ajax + mygeneration(2) easyobjects概述
  • 一个简单的基于System.Web.Mail的ASP.Net邮件发送程序
  • asp.net 1.1sp1 / 2.0 安装手册
  • 使用 Web 标准生成 ASP.NET 2.0 Web 站点
  • ASP.NET 2.0中实现模板中的数据绑定
  • 深入ASP.NET 2.0的提供者模型
  • ASP.NET AJAX入门系列(TerryLee's Tech Space)
  • 【随机文章】
  • Google中国将启用新模式 火速证实获代理权
  • Linux 系统的单用户模式、修复模式、跨控制台登录在系统修复中的运用
  • Ethernet的网络体系结构(2)
  • 数据结构与算法(C#实现)系列---广义树(一)
  • Portal实现原理
  • JBoss EJB3(Entity Beans)備忘記
  • 数据的输入
  • bugs的分类
  • 一个新的JMail(4.3版本)发送代码
  • 在C语言里嵌入python
  • 【相关评论】
    没有相关评论
    【发表评论】
    姓名:
    邮件:
    随机码*
    评论*
          
    |  首 页  |  版权声明  |  联系我们   |  网站地图  |
    CopyRight © 2004-2007 软讯网络 All Rigths Reserved.