在Asp.net系统制作过程中,门户类型的网站,我们可以用DIV+CSS+JS+Ajax全部搞定,但是一旦遇到界面元素比较复杂的时候,还是UserControl比较方便一些,各种封装,各种处理,然后拖到主页面,就好了。本文主要讲解如何在UserControl和WebForm页面中利用委托事件传值。本文仅提供一种思路,如果有更好的方案,还敬请赐教。

首先,我们设计一个简单的UserControl页面(实际应用中,我们可以按照业务逻辑,做的复杂一些),请看下图:

然后在Default.aspx页面中,我们只需要显示出从UserControl返回过来的值即可。

在这里,我相信很多人都选择利用Session或者是Application或者是Cache等等,这些确实也都可以,不过我这次利用Delegate 和 Event来实现,好处有几点:首先传过来的值不会莫名其妙的丢失(Session会过期,Cache的东西也会过期,或者是丢失);其次就是代码更好控制,如果UserControl中新加一些其他控件传值过来,不用new session或者是cache等,直接放到事件中,抛向接收页面就行;再者就是由于有事件回调函数,不用再另设Flag来判断UserControl是不是执行完毕等等。

下面是UserControl前台HTML内容,不做讲解:

<%@ Control Language="C#" AutoEventWireup="true" CodeBehind="MyUC.ascx.cs" Inherits="DelegateWeb.MyUC" %>
<div style="border-bottom:1px solid wheat;width:600px;height:100px; line-height:100px;">
请选择省份:
<asp:DropDownList ID="ddlBind" runat="server" Height="22px" Width="200px">
<asp:ListItem Value="0">请选择</asp:ListItem>
<asp:ListItem Value="1">上海市</asp:ListItem>
<asp:ListItem Value="2">北京市</asp:ListItem>
<asp:ListItem Value="3">广州市</asp:ListItem>
<asp:ListItem Value="4">深圳市</asp:ListItem>
<asp:ListItem Value="5">河南省</asp:ListItem>
<asp:ListItem Value="6">山东省</asp:ListItem>
</asp:DropDownList>
&nbsp;<asp:TextBox ID="txtKeyWords" runat="server"></asp:TextBox>
&nbsp;<asp:Button ID="btnQuery" runat="server" Text="查询内容" onclick="btnQuery_Click" />
</div>

下面是UserControl后台代码内容:

using System;
using System.Threading; namespace DelegateWeb
{
public delegate void CalculateDelegate(string ddlValue, string keyWords); //定义全局委托
public partial class MyUC : System.Web.UI.UserControl
{
protected void Page_Load(object sender, EventArgs e)
{
} public event CalculateDelegate CalculateEvent; //定义事件
protected void btnQuery_Click(object sender, EventArgs e)
{
//睡眠5s,模拟数据执行操作
Thread.Sleep();
string ddlSelectedTextValue = ddlBind.SelectedItem.Text + "|" + ddlBind.SelectedItem.Value;
string keyWords = txtKeyWords.Text;
//如果该事件已经被订阅,则抛出事件,
// 这里也预示着函数已经执行完毕,开始抛出执行后的结果了
if (CalculateEvent != null)
CalculateEvent(ddlSelectedTextValue, keyWords);
}
}
}

这里的代码很简单,其实就是利用委托事件,当操作完成后,将执行结果利用事件抛出去。
既然我把执行结果抛出去了,那么该由谁来接呢?毋庸置疑,当然是放置它的主页面来接收了。我们拖动这个UserControl到主页面中,则主页面中会通过

<%@ Register src="MyUC.ascx" tagname="MyUC" tagprefix="uc1" %>

来注册UserControl

在主页面代码中,我们需要接住刚刚抛出的事件:

using System;
using System.Web; namespace DelegateWeb
{
public partial class Default : System.Web.UI.Page
{
protected void Page_Load(object sender, EventArgs e)
{
MyUC1.CalculateEvent += (selectedItem, keyWords) =>
{
lblResult.Text = selectedItem +" "+ keyWords;
};
//事件的注册都要放到IsPostBack判断外面,否则会出现丢失的情况
if (!IsPostBack)
{
}
}
}
}

这个我就不多说了,+=号操作就代表注册事件,以便于进行回调操作。
如果只是说到这里,那么在Ajax大行其道的今天,点击按钮就刷新页面的做法并不会受到很多人的欢迎。这里我就来让操作Ajax话。

首先拖动ScriptManager到主页面中,然后拖动UpdatePanel到主页面中,整个首页布局如下面的样子即可:

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="DelegateWeb.Default" %>
<%@ Register src="MyUC.ascx" tagname="MyUC" tagprefix="uc1" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<title></title>
<style type="text/css">
body{font-size:12px;}
#MyUC1_ddlBind{border:1px solid wheat;}
#MyUC1_txtKeyWords{border:1px solid wheat;}
</style>
</head>
<body>
<form id="form1" runat="server">
<asp:ScriptManager ID="ScriptManager1" runat="server"></asp:ScriptManager>
<asp:UpdatePanel ID="UpdatePanel1" runat="server">
<ContentTemplate>
<uc1:MyUC ID="MyUC1" runat="server" />
<p>
从UserControl接收的内容为:<asp:Label ID="lblResult" runat="server" Text=""></asp:Label>
</p>
</ContentTemplate>
</asp:UpdatePanel>
</form>
</body>
</html>

然后点击按钮,5秒后,页面输出了结果,而且完全实现了无刷新页面局部调用。
显示结果如下:

做到这里,需要提示下,由于C#提供了Action委托,所以我们现在不需要声明Delegate委托,直接利用Action,也能实现效果:

 public event Action<string, string> CalculateEvent;

这篇文章可能过于简单了,但是提供了一种思路。我很想通过这篇文章和大家讨论下Asp.net中的事件传递等方面的内容,包括怎么设计等等,以期能够抛砖引玉。

Asp.net用户控件和委托事件的更多相关文章

  1. asp.net Login控件基本属性及事件说明

    原文:asp.net Login控件基本属性及事件说明 Login系列控件是微软为了简化我们的开发过程,为我们进行常规的安全开发提供块捷途径. Login系列控件包含下列控件: Login 登录控件 ...

  2. 将ASP.NET用户控件转化为自定义控件

    将ASP.NET用户控件转化为自定义控件 作者:Kevin Cheng (程建和) 最后修改时间:2006-03-14 概述:如何将ASP.NET用户控件移植为ASP.NET自定义控件 关键字:Asp ...

  3. 2016.2.24 利用用户控件和委托完美解决快速选择txbbox

    1.首先将tet_box和一个datagridview控件打包成用户控件uC_QuickTxtBox 2.在用户控件中定义执行主窗口的委托函数 3.主窗体中添加用户控件的load事件,赋值 uC_Qu ...

  4. ASP.NET用户控件事件的定义和实践

    假定用户控件(UserControl.ascx)中包含按钮控件  AButton,希望实现按  Button  按钮时,包含该用户控件的页面可以接收到事件. UserControl.ascx.cs   ...

  5. ASP.Net用户控件的使用

    一.概述: 与WEB窗体页相同,程序员可以使用任何文本编辑器创作用户控件,或者使用代码隐藏类开发用户控件.此外,与WEB窗体页一样,用户控件可以在第一次请求时被编译并存储在服务器内存中,从而缩短以后请 ...

  6. 039. asp.netWeb用户控件之七实现具有虚拟键盘的功能的用户控件

    用户控件ascx代码: <%@ Control Language="C#" AutoEventWireup="true" CodeFile="K ...

  7. 038. asp.netWeb用户控件之六实现日期选择的用户控件

    web用户控件的ascx代码: <%@ Control Language="C#" AutoEventWireup="true" CodeFile=&qu ...

  8. 037. asp.netWeb用户控件之五使用用户控件实现文件上传功能

    fileUpload.ascx代码: <%@ Control Language="C#" AutoEventWireup="true" CodeFile= ...

  9. 036. asp.netWeb用户控件之五使用用户控件实现分页数据导航

    UserDataPager.ascx用户控件代码: <%@ Control Language="C#" AutoEventWireup="true" Co ...

随机推荐

  1. iOS开发笔记2:单例模式(singleton)

    每一个app有且仅有一个UIApplication,类似UIApplication“ [UIApplication sharedApplication]”这种一个类有且仅有唯一实例的设计即单例模式. ...

  2. 关于UI资源获取资源的好的网站

    前言:和我一样喜欢UI的一定喜欢这里的内容. 下面是关于sketch资源获取网页,点击图片就能进入: 连接是:https://github.com/JakeLin 居然意外百度到Sketch中国,还提 ...

  3. Swift基础之闭包

    内容纲要: 1.闭包基础 2.关于闭包循环引用 正文: 1.闭包 闭包是自包含的函数代码块,可以在代码中被传递和使用.Swift 中的闭包与 C 和 Objective-C 中的代码块(blocks) ...

  4. OOD沉思录 --- 类和对象的关系 --- 包含关系4

    4.9 在实现语义约束时,最好根据类定义来实现.但是这经常会导致泛滥成灾的类,在这种情况下约束应当在类的行为中实现,通常在类的构造函数中实现,但不是必须如此. 还是以汽车为例,我们看汽车的定义,为了集 ...

  5. 【php】mysql全局ID生成方案

    生产系统随着业务增长总会经历一个业务量由小变大的过程,可扩展性是考量数据库系统高可用性的一个重要指标;在单表/数据库数据量过大,更新量不断飙涨时,MySQL DBA往往会对业务系统提出sharding ...

  6. python模块调用

    1.某个模块1被调用到另一个模块2的时候,当不想模块1中的某些代码在模块2中执行时,可以在模块一种添加如下代码: if    __name__  ==     "__main__" ...

  7. myeclipse关闭html,jsp等页面的可视化编辑器

    myeclipse打开html,jsp等页面时,有的是默认用可视化编辑器打开的,这样打开会显得很慢,只要关闭可视化编辑器就会快很多了,方法如下: 1,选择菜单: windows -> prefe ...

  8. SQL2008 提示评估期已过的解决方法

    提示窗口: 解决步骤: 第一步:进入SQL2008配置工具中的安装中心 第二步:再进入维护界面,选择版本升级 第三步:进入产品密钥,输入密钥 第四步:一直点下一步,直到升级完毕. SQL Server ...

  9. iTOP-4412开发板低功耗高性能的开源硬件平台——上手评测

    iTOP-4412开发板现在比较热门的开发板,笔者近期入了一套.也推荐给初学ARM的朋友学习,4412开发板搭载三星Exynos四核处理器,配备1GB内存,4GB固态硬盘EMMC存储,兼具快速读取与超 ...

  10. Oracle错误日志:ORA-00257

    今天下午刚启动程序,就报以下错误: Caused by: java.sql.SQLException: ORA-00257: 归档程序错误.在释放之前仅限于内部连接. 经查,是oracle数据库日志满 ...