用户控件 UserControl类

UserControl类时专门管理用户控件的类,是用户控件类的统称。用户控件就是扩展名为.ascx的Web窗体组件,与普通的服务器控件一样,其不具备单独运行的能力,必须依附于窗体页才能正常运行。通常用其来制作特殊服务器控件,或多个服务器控件的组合形式。

UserControl类以编程方式访问控件,并提供动态加载及调用等许多特性。用户控件在运行时,被编译为UserControl对象,并驻留在服务器内存中。

语法定义:

//namespace System.Web.UI

public class UserControl : TemplateControl, IAttributeAccessor, INamingContainer, IUserControlDesignerAccessor

 

UserControl类的构造函数:

public UserControl();

在运行时通常不适用new关键字创建UserControl对象,而是以动态加载.ascx文件的形式创建,其加载方法如下:

UserControl myUser = (UserControl)this.LoadControl("myDropDwon.ascx");

 

属性详解

UserControl类的属性用来在用户控件运行时获取上下文信息,下面列出这些属性及其说明

Application:Web请求的应用程序对象

Attributes:用户控件的所有属性

Cache:用户控件的缓存对象

CachePolity:用户控件的缓存参数集合

IsPostBack:是否是第一次加载用户控件

 

应用1:动态加载用户控件并获取其公共属性

本例主要说明动态加载用户控件,以及如何设置用户控件的公共属性。实例的用户控件是一个选择部门填充用户的复合控件,可以在项目中被多次调用。

在网站根目录下,添加一个用户控件,命名为“mydropdown.ascx”.

在用户控件内,添加两个DropDownList,属性设置如下:

<%@ Control Language="C#" AutoEventWireup="true" CodeFile="mydropdown.ascx.cs" 
Inherits="mydropdown" %>

<asp:DropDownList ID="DropDownList1" runat="server" AutoPostBack="True" OnSelectedIndexChanged="DropDownList1_SelectedIndexChanged1">
    <asp:ListItem Value="0">技术部</asp:ListItem>
    <asp:ListItem Value="1">测试部</asp:ListItem>
    <asp:ListItem Value="2">销售部</asp:ListItem>
</asp:DropDownList>
<asp:DropDownList ID="DropDownList2" runat="server"></asp:DropDownList>


为DropDownList1添加事件“SelectedIndexChanged”,代码如下:

    protected void DropDownList1_SelectedIndexChanged1(object sender, EventArgs e)
    {
        DropDownList2.Items.Clear();//首先清空
        switch (DropDownList1.SelectedValue)
        {
            case "0":
                DropDownList2.Items.Add("刘一");
                DropDownList2.Items.Add("刘二");
                break;
            case "1":
                DropDownList2.Items.Add("王一");
                DropDownList2.Items.Add("王二");
                break;
            case "2":
                DropDownList2.Items.Add("张一");
                DropDownList2.Items.Add("张二");
                break;
        }
    }

添加用户控件的公共属性“SelectValue”,并在Page_Load事件中初始化其值,代码如下:

    protected void Page_Load(object sender, EventArgs e)
    {
        SelectValue = DropDownList2.SelectedValue;
    }
    string _value;
    public string SelectValue
    {
        get { return _value; }
        set { _value = value; }
    }

打开Default.aspx页,添加一个Button按钮,设置其“Text”属性为“保存”。然后添加一个运行于服务器端的“div”元素,设置其“ID”属性为“Div1”.

<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
    <title>无标题页</title>
</head>
<body>
    <form id="form1" runat="server">
    <dir runat="server" id="div1">
    </dir>
    <div>
        <asp:Button ID="Button1" runat="server" OnClick="Button1_Click" Text="保存" /></div>
    </form>
</body>
</html>

 

在当前页使用“Register”指令注册用户控件,代码如下:

<%@ Register Src="mydropdown.ascx" TagName="mydropdown" TagPrefix="uc1" %>

双击“保存”按钮,添加其Click事件的代码,如下:

   protected void Button1_Click(object sender, EventArgs e)
    {
        mydropdown myuser = (mydropdown)div1.Controls[0].FindControl("user1");
            Response.Write(myuser.SelectValue);
    }

在Page_Load事件中添加动态加载用户控件的代码,如下所示:

    protected void Page_Load(object sender, EventArgs e)
    {
        mydropdown myuser = (mydropdown)this.LoadControl("mydropdown.ascx");
        myuser.ID = "user1";
        div1.Controls.Add(myuser);//固定动态加载的用户控件的位置
    }


输出结果:
 


 用户控件事件的应用

既然用户控件可以有自己的属性,那也一样可以有自己的事件。给自己的控件添加一个事件有的时候往往可以解决大难题,比如我们定义了一个用户控件,里面包含了一个GridView,如下图所示,记录的右边有一个“处理”按钮,这个记录都是待办记录,处理完后会变成已处理的记录,故此时GridView的数据要重新绑定。重新绑定之后,我们希望寄存页面的TreeView控件的数据也跟着回调刷新。解决这个问题最好的办法是在用户控件中添加事件,此事件负责(触发)TreeView控件数据的刷新。

 

public partial class Task_Controls_uTodoTaskList : ListUC
{
    public event ReLoadEventHandler ReLoadTreeViewData; //定义一个事件

    protected void lbtnHandle_Click(object sender, EventArgs e)  // Add by 梁宗桥
    {
        //进行回调绑定。
        this.DataBind();
        if (ReLoadTreeViewData != null)
        {
            this.ReLoadTreeViewData();
        }
    }
}

在MyTask.aspx页面的Page_Load页面中,注册一个“待办任务列表控件 刷新TreeView”的事件,注册之后,此事件什么时候执行完全取决于UTodoTaskList用户控件的需要。此过程是由内到外的调用(回调),即是用户控件调用MyTask.aspx中的事件处理程序BindTaskTreeData.

UTodoTaskList.ReLoadTreeViewData += new ReLoadEventHandler(BindTaskTreeData); 

 

    public void BindTaskTreeData()
    {
 
        if (Type.ToLower().Equals("all"))
        {
            UTaskTree.SetNodeText("todocheck", GetTasksConnt("todocheck", UserLoginer.LoginUser.ID) + Management.GetApprovalCount("todocheck", UserLoginer.LoginUser.EmplCode) + getYYZXTodoTaskCount(UserLoginer.LoginUser.EmplCode, "todocheck"));
            UTaskTree.SetNodeText("allowcancel", GetTasksConnt("allowcancel", UserLoginer.LoginUser.ID) + Management.GetApprovalCount("allowcancel", UserLoginer.LoginUser.EmplCode) + getYYZXTodoTaskCount(UserLoginer.LoginUser.EmplCode, "allowcancel"));
            UTaskTree.SetNodeText("checked", GetTasksConnt("checked", UserLoginer.LoginUser.ID) + Management.GetApprovalCount("checked", UserLoginer.LoginUser.EmplCode) + getYYZXTodoTaskCount(UserLoginer.LoginUser.EmplCode, "checked"));
        }
        else
        {
            UTaskTree.SetNodeText("todocheck", GetTasksConnt("todocheck", UserLoginer.LoginUser.ID) + getYYZXTodoTaskCount(UserLoginer.LoginUser.EmplCode, "todocheck"));
            UTaskTree.SetNodeText("allowcancel", GetTasksConnt("allowcancel", UserLoginer.LoginUser.ID) + getYYZXTodoTaskCount(UserLoginer.LoginUser.EmplCode, "allowcancel"));
            UTaskTree.SetNodeText("checked", GetTasksConnt("checked", UserLoginer.LoginUser.ID) + getYYZXTodoTaskCount(UserLoginer.LoginUser.EmplCode, "checked"));
        }

        UTaskTree.SetNodeText("todotask", Management.GetTodoTaskCount("todotask", string.Empty, UserLoginer.LoginUser.ID));
        UTaskTree.SetNodeText("overdue", Management.GetTodoTaskCount("overdue", string.Empty, UserLoginer.LoginUser.ID));
        UTaskTree.SetNodeText("completedtask", Management.GetCompletedTaskCount(string.Empty, UserLoginer.LoginUser.ID));

    }


意义:在用户控件中定义了事件,就间接实现对寄存页面各块功能的控制,基本可以说是指哪打哪(有需要可以定义各种事件)。


工作流用户控件对事件的使用体现就更加淋漓尽致了。

 WFButtons1.AfterCall += new WorkFlow_Control_WFButtons.AfterCallEventHandler(WFButtons1_AfterCall);



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值