- 热门文章:
- · 无外部控件制作多媒体播放器(二)
- · 用TreeView显示数据通用方法
- · 无外部控件制作多媒体播放器(一)
- · Web Browser Express 概述
- · datagrid编辑删除分页
- · 展现C# 清单5.10 生成exe文件执行的问题
- · 联通增值业务“定位之星”L1协议服务端的模拟器
- · 一个自认为写得还可以的存储过程,就是没有注释,看起来有点乱。与ERP的BOM相关的
- · [EnterpriseServices]利用assembly定义我们的组件在COM+中的注册方式
- · 给windows服务添加描述
- · 用户认证管理设计方案
- · Solidworks二次开发—07—控制草图对象
上一篇:DirectX9 3D快速上手 3 >>
AlertButton, 您确定要执行吗?
在.Net Web应用程序开发中, 我们希望用户在做一个重要的操作时, 能够询问或警告用户. 或者希望我们有这么一个简单实用的控件, 能在用户确定后引发一个服务端的事件.
这个控件的原理很简单,主要是实现IPostBackEventHandler接口和调用Page.GetPostBackEventReference(this, eventArgument), 实现对客户端__doPostBack方法的调用, 引发服务端的事件
而以下这段关键代码是实现功能的核心:
if(AlertString != "") //仅在用户确认后调用客户端的__DostPostBack, 引发服务端事件
{
Action = "javascript:if(window.confirm(\@#" + AlertString + "@#)==true){";
Action += Page.GetPostBackEventReference(this, "Click");
Action += ";}";
}
全部代码:
using System;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.ComponentModel;
namespace Booksir.WebControls
{
/// <summary>
/// AlertButton 的摘要说明。
/// </summary>
[
DefaultProperty("Text"),
ToolboxData("<{0}:AlertButton runat=server></{0}:AlertButton>"),
System.ComponentModel.DefaultEvent("Click"),
]
public class AlertButton : System.Web.UI.WebControls.WebControl, IPostBackEventHandler
{
private ViewStateBag StateBag;
public AlertButton()
{
StateBag = new ViewStateBag(this.ViewState);
}
public event EventHandler Click; //事件句柄
public enum AppearanceEnum
{
Button,
ImageButton,
}
/// <summary>
/// 按钮的外观模式
/// </summary>
[
Bindable(false),
Category("Appearance"),
DefaultValue(AppearanceEnum.Button),
Description("按钮的外观模式"),
]
public AppearanceEnum Appearance
{
get
{
object obj;
obj = ViewState["Appearance"];
if(obj == null)
{
Appearance = AppearanceEnum.Button;
return AppearanceEnum.Button;
}
return (AppearanceEnum)obj;
}
set
{
ViewState["Appearance"] = value;
}
}
/// <summary>
/// 在DefaultValue为非常量值的情况下,可以用Reset...来重置属性的默认值
/// </summary>
void ResetAppearance()
{
Appearance = AppearanceEnum.Button;
}
/// <summary>
/// 该方法的存在使系统在属性为默认值不提交属性赋值代码
/// </summary>
/// <returns></returns>
bool ShouldSerializeAppearance()
{
return Appearance != AppearanceEnum.Button;
}
[
Bindable(true),
Category("Appearance"),
DefaultValue("")
]
public string Text
{
get
{
return StateBag.GetString("Text", this.ID);
}
set
{
ViewState["Text"] = value;
}
}
/// <summary>
/// 在执行动作前的提示
/// </summary>
[
Bindable(true),
Category("Appearance"),
DefaultValue(""),
Description("在执行动作前的提示"),
]
public string AlertString
{
get
{
return StateBag.GetString("AlertString", "是否开始执行?");
}
set
{
ViewState["AlertString"] = value;
}
}
/// <summary>
/// 按钮可用时的Image
/// </summary>
[
Description("按钮可用时的Image"),
Category("Appearance"),
Editor(typeof(System.Web.UI.Design.UrlEditor), typeof(System.Drawing.Design.UITypeEditor)),
]
public string EnabledImage
{
get
{
return StateBag.GetString("EnabledImage", "");
}
set
{
ViewState["EnabledImage"] = value;
}
}
/// <summary>
/// 按钮不可用时的Image
/// </summary>
[
Description("按钮不可用时的Image"),
Category("Appearance"),
Editor(typeof(System.Web.UI.Design.UrlEditor), typeof(System.Drawing.Design.UITypeEditor)),
]
public string DisabledImage
{
get
{
return StateBag.GetString("DisabledImage", "");
}
set
{
ViewState["DisabledImage"] = value;
}
}
/// <summary>
/// 将此控件呈现给指定的输出参数。
/// </summary>
/// <param name="output"> 要写出到的 HTML 编写器 </param>
protected override void Render(HtmlTextWriter output)
{
if(Appearance == AppearanceEnum.Button)
output.Write(GetButtonHtml());
else
output.Write(GetImageButtonHtml());
}
/// <summary>
/// 获取呈现Button时的Html
/// </summary>
/// <returns></returns>
private string GetButtonHtml()
{
const string ButtonTag = "<input type=button value=@#{0}@# onclick=\"{1}\" style=\"{2}\"{3} title=@#{4}@#>";
string sHtml;
string Action;
string Style = "width:{0};height:{1};";
if(AlertString != "")
{
Action = "javascript:if(window.confirm(\@#" + AlertString + "@#)==true){";
Action += Page.GetPostBackEventReference(this, "Click");
Action += ";}";
}
else
Action = "javascript:" + Page.GetPostBackEventReference(this, "Click");
Style = String.Format
(
Style,
this.Width.ToString(),
this.Height.ToString()
);
Style += this.Attributes["Style"];
sHtml = String.Format
(
ButtonTag,
Text,
Action,
Style,
Enabled ? "" : " disabled",
this.ToolTip
);
return sHtml;
}
/// <summary>
/// 获取呈现ImageButton时的Html
/// </summary>
/// <returns></returns>
private string GetImageButtonHtml()
{
const string LinkTag = "<a onclick=\"{0}\" title=@#{1}@# style=\"{2}\">{3}</a>";
const string ImgTag = "<img src=@#{0}@# border=0>";
string sHtml;
string Action;
string Image;
string Style;
if(this.Enabled)
{
if(AlertString != "") //仅在用户确认后调用客户端的__DostPostBack, 引发服务端事件
{
Action = "javascript:if(window.confirm(\@#" + AlertString + "@#)==true){";
Action += Page.GetPostBackEventReference(this, "Click");
Action += ";}";
}
else
Action = "javascript:" + Page.GetPostBackEventReference(this, "Click");
if(EnabledImage != "")
Image = String.Format(ImgTag, EnabledImage);
else
Image = Text;
}
else
{
Action = "javascript:void()";
if(DisabledImage != "")
Image = String.Format(ImgTag, DisabledImage);
else
Image = Text;
}
Style = "cursor:hand;";
Style += this.Attributes["Style"];
sHtml = String.Format
(
LinkTag,
Action,
this.ToolTip,
Style,
Image
);
return sHtml;
}
protected virtual void OnClick()
{
if(Click != null)
Click(this, EventArgs.Empty);
}
public void RaisePostBackEvent(string eventArgument)
{
if(eventArgument == "Click")
OnClick();
}
}
}
好了, 到此结束, 将以上代码编译为DLL, 并加入为控件吧, 试试看, 是不是简单实用呢?
下一篇:无外部控件制作多媒体播放器(二) >>
相关文章:
- · 数据库事务处理的另外一种方法
- · 《Essential .Net》读书笔记 - Chapter 3
- · DX图形显示基本流程(基于MESH静态模型绘制----托管代码)
- · 如何让 DevExpress 的 DateEdit 控件正确显示日期的周名
- · ASP.net下的前台日历控件源代码(不刷新页面)
- · 通过可视化继承和页面模板控制站点设计
- · 在ASP.Net中两种利用CSS实现多界面的方法
- · 数据表单向导的快速实现
- · Posting form data from ASP.NET page to another URL
- · Asp.net中Treeview终极解决方案
- · 解决ASP.NET创建的线程的用户改变引发的拒绝访问错误
- · 有关sql注入
- · 一个动态编译的例子
- · 一个拷贝整个文件夹(包括子文件夹)的方法(原创)
- · 在ASP.NET中实现弹出日历
- · 在DataGrids和DropDownLists中使用ADO
- · asp.net 页面中生成 RSS 2.0 提要
- · Session登陆后丢失的解决办法
- · 基于HTTP协议用WinSock实现任意文件下载
- · 奔腾Flash Player source code
- · 《Essential .Net》读书笔记 - Chapter 2
- · 《Essential .Net》读书笔记 - Chapter 1
- · 获取指定IP的终端的MAC地址
- · 网络传输(FTP)问题
- · Paint.NET: An Open Source GDI+ App Likes Photoshop
- · 看到有人用 WebClient来下载, 发篇用 WebRequest 实现有进度下载的吧.
- · 树形控件TreeView的序列化
- · 使用javascript+XML实现分页
- · 使用Control.Invoke处理多线程应用程序界面
- · WEB页面TreeView的应用-(得到所有选中的节点)
- · DotNetNuke(DNN)
- · 枚举器模式(Enumerator pattern)
- · 用ASP.NET 1.1 新特征防止Script攻击
- · 关于ASP.Net中的时间处理
- · javascript实现的数据表格:冻结列、调整列宽和客户端排序
- · [常见问题]cookie使用1.Page与HttpContext的Request、Response
- · 怎样在页面和页面的用户控件进行交互
- · webform页面间传值的特殊方法
