.ascx
用户控件
参考系列教程User controls in asp.net - Part 104
用户控件包含了html、代码和其他Web或者用户控件的组合,并在Web服务器上以自己的文件格式保存,其扩展名是*.ascx
用户控件重用相同的代码,从而节省了大量的开发和测试时间。简而言之,用户控制,增加了代码的可重用性,实现封装,减少开发和维护时间。
用户控件与webform的异同:
1.设计和实现用户控件与webform类似
2.webform的扩展名为.aspx
,以@Page
指令开头,可以包含<html>
, <head>
, 和<body>
元素。如:
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" %>
3.用户控件以@Control
指令开头,不能含有<html>
, <head>
, 和<body>
元素。如:
<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="CalenderUserControl.ascx.cs" Inherits="WebApplication1.CalenderUserControl" %>
在webform中使用用户控件
参考Adding and using user controls on a webform - Part 105
在webform中使用用户控件,仅仅把用户控件拖动到webform中即可。此时webform多了如下的代码:
<%@ Register Src="~/CalenderUserControl.ascx" TagPrefix="uc1" TagName="CalenderUserControl" %>
......
<uc1:CalenderUserControl runat="server" ID="CalenderUserControl" />
如果你打算在多个Web表单上添加用户控件,而不是在每个Web窗体中包含Register
指令。可以在web.config
的配置文件中注册一次控件,就可以在多个webform中使用用户控件,而不使用Register
指令
<system.web>
<pages>
<controls>
<add src="~/CalendarUserControl.ascx" tagName="CalendarUserControl" tagPrefix="uc1"/>
</controls>
</pages>
</system.web>
用户控件的自定义事件
参考Raising custom events from user controls - Part 106
这里的要求是在Calendar
的可见性发生改变时,希望触发CalendarVisibilityChanged
事件。
从CalendarUserControl
用户控件中引发CalendarVisibilityChanged
事件的步骤
1.创建CalendarVisibilityChangedEventArgs
类,持有事件数据
public class CalendarVisibilityChangedEventArgs : EventArgs
{
private bool _isCalendarVisible;
//构造方法
public CalendarVisibilityChangedEventArgs(bool isCalendarVisible)
{
this._isCalendarVisible = isCalendarVisible;
}
//calendar课件就返回true,否则返回false
public bool isCalendarVisible
{
get
{
return this._isCalendarVisible;
}
}
}
2.创建CalendarVisibilityChangedEventHandler
委托,参数sender
是CalendarUserControl
的一个实例,而CalendarVisibilityChangedEventArgs
对象则包含事件数据
public delegate void CalendarVisibilityChangedEventHandler(object sender, CalendarVisibilityChangedEventArgs e);
3.创建CalendarVisibilityChanged
事件。要记住,事件是delegate类型的变量。
public event CalendarVisibilityChangedEventHandler CalendarVisibilityChanged;
4.创建一个protected virtual
方法来引发事件。由于该方法是protected
和virtual
的,所以的源于CalendarUserControl
的类都可以重写这个方法。
protected virtual void OnCalendarVisibilityChanged(CalendarVisibilityChangedEventArgs e)
{
if (CalendarVisibilityChanged != null)
{
CalendarVisibilityChanged(this, e);
}
}
5.在Calendar的可见性发生改变后来引发这个事件。
protected void ImgBtn_Click(object sender, ImageClickEventArgs e)
{
if (Calendar1.Visible)
{
Calendar1.Visible = false;
CalendarVisibilityChangedEventArgs calendarVisibilityChangedEventData =
new CalendarVisibilityChangedEventArgs(false);
OnCalendarVisibilityChanged(calendarVisibilityChangedEventData);
}
else
{
Calendar1.Visible = true;
CalendarVisibilityChangedEventArgs calendarVisibilityChangedEventData =
new CalendarVisibilityChangedEventArgs(true);
OnCalendarVisibilityChanged(calendarVisibilityChangedEventData);
}
}
使用用户自定义事件
使用事件,有2步:
1.创建如下的handler。这个方法的签名与CalendarVisibilityChangedEventHandler委托的签名须一致。
如下获取IsCalendarVisible
属性
protected void CalendarUserControl1_CalendarVisibilityChanged(object sender, CalendarVisibilityChangedEventArgs e)
{
Response.Write("Calendar Visibility = " + e.isCalendarVisible.ToString());
}
2.使用+=
注册CalendarUserControl
的CalendarVisibilityChanged
事件
protected void Page_Load(object sender, EventArgs e)
{
CalendarUserControl1.CalendarVisibilityChanged += new CalendarVisibilityChangedEventHandler(CalendarUserControl1_CalendarVisibilityChanged);
}
效果如下:
动态加载用户控件
参考:
网上的大多数文章,介绍说,如果我想要动态的创建control,并在postback的时候保存viewstate的状态,控件要在Page_Init()
方法中加载。然而,在这里,我使用的是Page_Load()
事件,控件也可以在postback时维持它们的状态。
1.首先要添加一个PlaceHolder
控件,如果不使用PlaceHolder
控件,会报运行时异常
2.添加自定义控件
protected void Page_Load(object sender, EventArgs e)
{
CalendarUserControl calendarUserControl = (CalendarUserControl)LoadControl("~/CalendarUserControl.ascx");
calendarUserControl.ID = "CU1";
calendarUserControl.DateSelected += new DateSelectedEventHandler(calendarUserControl_DateSelected);
calendarUserControl.CalendarVisibilityChanged +=
new CalendarVisibilityChangedEventHandler(calendarUserControl_CalendarVisibilityChanged);
PlaceHolder1.Controls.Add(calendarUserControl);
}
protected void calendarUserControl_DateSelected(object sender, DateSelectedEventArgs e)
{
Response.Write(e.SelectedDate.ToShortDateString());
}
protected void calendarUserControl_CalendarVisibilityChanged(object sender, CalendarVisibilityChangedEventArgs e)
{
Response.Write("Calende Visible = " + e.isCalendarVisible.ToString());
}
protected void Button1_Click(object sender, EventArgs e)
{
Response.Write(((CalendarUserControl)PlaceHolder1.FindControl("CU1")).SelectedDate);
}