用户控件 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);