.ascx用户控件

.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委托,参数senderCalendarUserControl的一个实例,而CalendarVisibilityChangedEventArgs对象则包含事件数据

public delegate void CalendarVisibilityChangedEventHandler(object sender, CalendarVisibilityChangedEventArgs e);

3.创建CalendarVisibilityChanged事件。要记住,事件是delegate类型的变量。

public event CalendarVisibilityChangedEventHandler CalendarVisibilityChanged;

4.创建一个protected virtual方法来引发事件。由于该方法是protectedvirtual的,所以的源于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.使用+=注册CalendarUserControlCalendarVisibilityChanged事件

        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);
        }
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页