ASP.NET进阶(5):认清控件 之 Button

asp.net 按钮 样式 源码 按钮样式源码! 很值得下载看看!资源免费,大家分享!! 立即下载
“做.NET不值钱,没有技术含量,拖拖控件就行了。”———— 这类言语我最讨厌了,一点技术含量都没有,不懂.NET就瞎嚷嚷。不管做什么,做好都不容易,你没做过怎么知道没有技术含量呢? 我们既享受控件带来的快捷,也知其原理,甚至可以自己开发控件,你还能说我们没技术含量?!

控件是什么? 是.NET Framework对Html里的元素的封装。 他把一个<input type="button"/>变成了 Button类,把<span></span>变成了Label类,把<input type="select">变成了DropDownList。这就是控件,就是这些类。

上节我们提到了Page类,Page的生命周期里有些事件是和处理控件类有关的。

PreInit
使用该事件来执行下列操作:
检查 IsPostBack 属性来确定是不是第一次处理该页。
创建或重新创建动态控件。
动态设置主控页。
动态设置 Theme 属性。
读取或设置配置文件属性值。
Render
这不是事件;在处理的这个阶段,Page 对象会在每个控件上调用此方法。所有 ASP.NET Web 服务器控件都有一个用于写出发送给浏览器的控件标记的 Render 方法。
如果创建自定义控件,通常要重写此方法以输出控件的标记。不过,如果自定义控件只合并标准的 ASP.NET Web 服务器控件,不合并自定义标记,则不需要重写 Render 方法。
一个是初始化,一个是显示,其他的还有事件之类的,我们暂且不提。我们可以看出,初始化其实就是实例化desinger.cs里用到的控件。而最终这些控件都需要转换成HTML标签,也就是被Page调用其Render方法。Page自身也是控件所,以Page的Render就是负责生成HTML的。

控件类都在System.Web.UI.WebControls下,我们可以打开MSDN查看一些常用控件的类和其相关的事件方法。如果有用Refletor的话,可以打开System.Web.dll查看更加详细的源码。你会发现有意思的继承关系,理解MS的设计理念,也更方便我们对控件有个更加清晰的认识。

Button类。
当我们在FORM里放置一个Button,该按钮默认为Submit按钮,如果设为UseSubmitBehavior = false,就可以看到客户端会生成该按钮需要的JS代码。
    <div class="aspNetHidden">
    
<input type="hidden" name="__EVENTTARGET" id="__EVENTTARGET" value="" />
    
<input type="hidden" name="__EVENTARGUMENT" id="__EVENTARGUMENT" value="" />
    
<input type="hidden" name="__VIEWSTATE" id="__VIEWSTATE" value="/wEPDwUKMTcxODU4OTc0MWRk6Htqf5QF2exQx/BOtdDx1djNfbW7y3bPbmRizhypOr4=" />
    
</div>

    
<script type="text/javascript">
    
//<![CDATA[
    var theForm = document.forms['form1'];
    
if (!theForm) {
        theForm 
= document.form1;
    }
    
function __doPostBack(eventTarget, eventArgument) {
        
if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value 
= eventTarget;
        theForm.__EVENTARGUMENT.value 
= eventArgument;
        theForm.submit();
        }
    }
    
//]]>
    </script>
    
<input type="submit" name="Button1" value="Button" id="Button1" />
    
<input type="button" name="Button2" value="Button" onclick="javascript:__doPostBack('Button2',')" id="Button2" />

 

__doPostBack就是出发form的提交,而Button2调用的时候传值了自己的名字,然后__EVENTTARGET的值被设为了Button2,这样在提交的时候,Post的数据里就会告诉服务端是Button2触发的!再看Button1却没有调用__doPostBack,因为他是submit类型,在提交的时候浏览器会把他的名字默认提交过去,同时其他的按钮不会被提交。

所以,既然服务端知道了是哪个按钮被点过,自然就会调用该按钮实例的OnClick方法。看看Page类里有一个方法。
if (this.IsPostBack)
{
    
this.RaisePostBackEvent(this._requestValueCollection);
}

private void RaisePostBackEvent(NameValueCollection postData)
{
     
if (this._registeredControlThatRequireRaiseEvent != null)
     {
         
this.RaisePostBackEvent(this._registeredControlThatRequireRaiseEvent, null);
     }
     
else
     {
         
string str = postData["__EVENTTARGET"];
         
bool flag = !string.IsNullOrEmpty(str);
         
if (flag || (this.AutoPostBackControl != null))
         {
     Control control 
= null;
     
if (flag)
     {
         control 
= this.FindControl(str);
     }
     
if ((control != null) && (control.PostBackEventHandler != null))
     {
         
string eventArgument = postData["__EVENTARGUMENT"];
         
this.RaisePostBackEvent(control.PostBackEventHandler, eventArgument);
     }
         }
         
else
         {
     
this.Validate();
         }
     }
}

 

啊哈!明白没有?在IsPostBack(也就是提交)后,调用了触发所有控件事件的方法。postData["__EVENTTARGET"]明显就是我们刚才的点的按钮名称,然后通过FindControl得到该对象,最后调用RaisePostBackEvent方法出发该对象的事件。再往下看具体流程:
[EditorBrowsable(EditorBrowsableState.Advanced)]
protected virtual void RaisePostBackEvent(IPostBackEventHandler sourceControl, string eventArgument)
{
   sourceControl.RaisePostBackEvent(eventArgument);
}

  也就是说,Button类必须实现IPostBackEventHandler接口(因为Page不知道控件到底是什么,所以要使用接口,这就是接口的用处)。

看看具体实现:
    protected virtual void RaisePostBackEvent(string eventArgument)
    {
         
base.ValidateEvent(this.UniqueID, eventArgument);
         
if (this.CausesValidation)
         {
             
this.Page.Validate(this.ValidationGroup);
         }
         
this.OnClick(EventArgs.Empty);
         
this.OnCommand(new CommandEventArgs(this.CommandName, this.CommandArgument));
    }

 

首先是验证,然后是执行OnClick,然后执行OnCommand。呵呵,一个OnClick我们终于走完了~ 感觉如何? 头涨了没?

看下Button类,确实继承IPostBackEventHandler接口。
    [Designer("System.Web.UI.Design.WebControls.ButtonDesigner, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a"), SupportsEventValidation, ToolboxData("<{0}:Button runat=\"server\" Text=\"Button\"></{0}:Button>"), DefaultEvent("Click"), DefaultProperty("Text"), DataBindingHandler("System.Web.UI.Design.TextDataBindingHandler, System.Design, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a")]
    
public class Button : WebControl, IButtonControl, IPostBackEventHandler
    {
    ....
        [WebCategory(
"Action"), WebSysDescription("Button_OnClick")]
        
public event EventHandler Click;
        
protected virtual void OnClick(EventArgs e)

        [WebCategory(
"Action"), WebSysDescription("Button_OnCommand")]
        
public event CommandEventHandler Command;
    
        [WebSysDescription(
"Button_Text"), WebCategory("Appearance"), Bindable(true), Localizable(true), DefaultValue("")]
        
public string Text { get; set; }
    ....
    }

 

并且看到熟悉的Click,Command,Text,而ID,Width,Height则在他的父类中。

看看OnClick是干嘛的?
    protected virtual void OnClick(EventArgs e)
    {
        EventHandler handler 
= (EventHandler) base.Events[EventClick];
        
if (handler != null)
        {
         handler(
this, e);
        }
    }

 

OnClick的方法是被点击后执行的方法,具体是从Events里找到EventClick类型的委托,其实就是判断Click事件是否被订阅,如果有该类型委托,则表明已经被订阅,便执行该委托实例(也就是我们定义的Click具体方法)。

再来看下是如何订阅的:
    [WebCategory("Action"), WebSysDescription("Button_OnClick")]
    
public event EventHandler Click
    {
        add
        {
         
base.Events.AddHandler(EventClick, value);
        }
        remove
        {
         
base.Events.RemoveHandler(EventClick, value);
        }
    }

 

Click事件具有add和remove两个类似属性的get和set的方法,这当然是C#的特定语法,实际编译后的IL里是两个小方法。
Add是订阅,remove是取消订阅。AddHandler就是把具体的方法和委托类型添加到Events里。
    public void AddHandler(object key, Delegate value)
    {
         ListEntry entry 
= this.Find(key);
         
if (entry != null)
         {
             entry.handler 
= Delegate.Combine(entry.handler, value);
         }
         
else
         {
             
this.head = new ListEntry(key, value, this.head);
         }
    }

 

一气呵成,我们知道了Click的具体调用实现,且明白的事件的订阅。后面再说控件的其他属性,休息休息。后面会介绍Render和DataBind :) 
SAP_SD模块销售开票计划预收款系统配置及前台操作说明 在 SAP SD 中,开票计划(Billing Plan)是一种允许根据时间节点或里程碑对销售订单进行分期开票的功能。其中最常见的一种应用就是预收款(Down Payment Billing),即在销售订单中直接定义某个百分比或金额作为预收款,系统在开票时自动生成预收账单。大额合同或长期项目型销售(先收 20%,交货前收 30%,交货后收 50%)。分期付款模式(分阶段收款)。必须预收款才能安排生产或交货的业务。后台路径:SPRO—销售与分享—销售—销售凭证—销售凭证项目—定义项目类别。 阅读详情

相关推荐

AnyGrasp实战指南:从环境配置到抓取检测与跟踪

本文详细介绍了AnyGrasp从环境配置到抓取检测与跟踪的实战指南。涵盖硬件要求、关键依赖安装避坑、抓取检测与跟踪的实战技巧,以及常见问题解决方案和性能优化建议,帮助开发者快速掌握这一高精度物体抓取检测与跟踪技术。

weixin_33712987的博客 274

ASP.NET控件之Button控件

使用 Button 控件在网页上创建下压按钮。 语法:<asp:Button /> 既可以创建“提交”按钮,也可以创建“命令”按钮。 默认情况下,Button 控件是“提交”按钮。“提交”按钮没有与之相关联的命令名(由 CommandName 属性指定),它只是将网页回发到服务器。可以为 Click 事件提供事件处理程序,以便以编程方式控制在用户单击“提交”按钮时执行的...

weixin_30647065的博客 301

Adams软件安装与配置全攻略:从入门到机器人仿真

机械系统动力学仿真软件Adams是工业机器人开发的重要工具,其安装过程涉及许可证配置、环境变量设置等关键技术环节。专业仿真软件安装通常需要处理系统兼容性、组件依赖和授权验证等工程问题,特别是在机器人控制仿真等场景中,还需集成MATLAB/Simulink等第三方工具。本文以Windows平台为例,详解Adams安装的核心步骤,包括系统环境检查、许可证服务器配置、工业机器人专项模块安装等实践要点,并针对NVIDIA Quadro显卡优化、27500端口通信等常见问题提供解决方案,帮助用户快速搭建可靠的仿真环境

weixin_28523493的博客 201

ASP.NET-常用控件总结

本文介绍了ASP.NET控件编程的基础知识和常用技巧。通过对基础控件如TextBox、DropDownList等的介绍,读者可以了解如何在ASP.NET应用中使用这些控件来实现用户界面的交互。此外,文章还深入探讨了UpdatePanel实现局部刷新以及动态事件的处理方法,帮助读者更好地优化页面性能和提升用户体验。通过这些内容的学习,读者可以掌握ASP.NET控件编程的关键技能,并能够更高效地开发出功能丰富、交互友好的Web应用程序。

踏雨歌青春,诗酒趁年华 3578

十二、基于FPGA实现slave SelectMAP配置逻辑

slave SelectMAP配置

weixin_41838250的博客 8755

Matlab Arduino 硬件支持包安装 MATLAB_Support_Package_for_Arduino_Hardware

Matlab Arduino硬件支持包离线安装

weixin_43283734的博客 2842

常见控件用法.

Button控件、LinkButton控件、ImageButton控件、HyperLink控件。它们都有一个共同点,就是在单击的时候都可以触发Click事件。        1. Button控件               写法:                                              CausesValidation="true/false" OnClick=

瀚海长空 817

国科大学习资料--数据挖掘(刘莹)--第三章习题及参考答案

国科大学习资料–数据挖掘(刘莹)–第三章习题及参考答案 国科大学习资料–数据挖掘(刘莹)–第三章习题及参考答案 国科大学习资料–数据挖掘(刘莹)–第三章习题及参考答案 第 3 章分类与回归 3.1简述决策树分类的主要步骤。 答:决策树生成的过程如下: (1)对数据源进行数据预处理, 得到训练集和测试集; (2)对训练集进行训练; (3)对初始决策树进行树剪枝; (4)由所得到的决策树提取分类规则; (5)使用测试数据集进行预测,评估决策树模型; 3.2给定决策树,选项有:(1)将决策树转换成规则,然后对结果

无名何许人的博客 3093

ASP.NET程序设计教程2---关于label和button的基础用法

上一讲,讲述了如何创建一个ASP.NET网站。这一讲,主要讲解ASP.NET的基础用法。 1.2 创建ASP.NET网站的基本步奏 (1)根据用户需求进行问题分析,构思出合理的程序设计思路。 (2)创建一个新的ASP.NET网站。 (3)设计网站中包含的所有Web页面的外观。 (4)设置页面中所有控件对象的初始属性值。 (5)编写用于响应系统时间或用户事件的代码。 (6)运行并调试程序。 接下来以...

weixin_43981402的博客 2502

手把手教你从入门到精通C# Modbus通信

本文是《Modbus通信从入门到精通》的导读,本专栏将会详细介绍ModusRTU 、ModbusASCII、ModbusTCP这三种协议的C#实现,由一个高级工程师多年实战经验总结而成,绝对干货!

qq_34059233的博客 1万+

【机器学习-09】特征工程

特征工程是机器学习模型构建的初步工作,但它的重要性却贯穿整个模型生命周期。在进行特征工程时,我们需要充分利用数据科学的知识和技巧,结合具体的应用场景和业务需求,来制定出最合适的特征提取和转换策略。只有这样,我们才能为机器学习模型提供最有价值的输入,从而使其发挥出最大的潜力。总之,特征工程是机器学习中的一项关键任务,它需要我们用心去探索、去实践、去创新。只有不断地优化和完善特征工程的过程,我们才能构建出更加准确、更加可靠的机器学习模型,为实际应用带来更大的价值。

qq_38614074的博客 2万+

ASP.NET进阶:认清控件 之 Button (转)

“做.NET不值钱,没有技术含量,拖拖控件就行了。”———— 这类言语我最讨厌了,一点技术含量都没有,不懂.NET就瞎嚷嚷。不管做什么,做好都不容易,你没做过怎么知道没有技术含量呢? 我们既享受控件带来的快捷,也知其原理,甚至可...

cuibinmo3519的博客 144

一.镜头知识之焦点,焦距,有效焦距,前焦距,后焦距

由光学系统中镜片的最后一面到像面的距离。

AIoT深度探索者 | 嵌入式系统架构师 深耕物联网(IoT)与人工智能(AI)融合技术,聚焦​​边缘计算、图像开发、低功耗通信协议​​,致力于智能硬件,关注我获取最新技术文章信息与海量资源~ 5583

ASP.NET 服务器控件

ASP.NET 服务器控件

m0_62263513的博客 1248

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

asp.net 基本控件

最经典的图标按钮就是Windows的最小化、最大化、关闭、前进后退、刷新按钮。属性:纯图标按钮的形状本身就具有很形象的解释力,光标悬浮在按钮上时经常会弹出更详细的说明信息框,用来具体解释此按钮实现的功能。点击命令按钮产生的响应有弹出新窗口、弹出框体、弹出新页面、切换或弹出菜单(结合菜单栏)、弹出列表框(结合下拉列表)、刷新、放大/缩小/收起/关闭窗口等等。属性:纯图片按钮就是一张图片可以点击产生响应,不同于图标按钮,图片更有预览意义,图片内容不代表功能,同一功能可能因为场景、对象不同而图片内容不同。

pengsss_的博客 3054

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

ASP.net button验证

1.ok &lt;input id="Time" type="hidden" value='&lt;%=Time %&gt;' /&gt; &lt;input id="Name" type="hidden" value='&lt;%=Name %&gt;' /&gt; www.wobiji.net 我笔记 &lt;asp:B

我笔记 778

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

几个常用的控件(1)

几种控件的应用

m0_62263513的博客 1240

ASP.Net button 确认

Button有两个点击事件 onclick 触发服务端事件,脚本为c#或VB.NET OnClientClick 触发客户端事件,脚本一般为JavaScript,此属性为ASP.NET 2.0新增,1.1之前需要使用添加attribute的方法来添加客户端事件 在点击按钮时,先运行OnClientClick 中的脚本,如果返回值为true,则再运行button_onclic...

weixin_30929295的博客 119

ASP.NET - Button、LinkButton和ImageButton

 ASP.NET Framework包含三个用于向服务器端提交表单的控件:Button、LinkButton和ImageButton。这三个控件拥有同样的功能,但每种控件的外观界面不同。本节学习如何在页面中使用这三种控件。然后,学习如何关联客户端脚本和服务器端Button控件,以及如何使用Button控件把一个表单传到不是当前页的页面。最后,学习如何处理Button控件的Command

dodream的专栏 9101

ASP.NET中 Button(按钮)的使用

ylbtech-ASP.NET-Control-Basic:Button(按钮)的使用  ASP.NET中 Button(按钮)的使用。 1.A,运行效果返回顶部 Button(按钮)   属性 值 作用  PostBackUrl  url  单击时,指向的页面  ToolTip  提示语  ...

weixin_34185512的博客 1652

asp.net控件开发系列学习----Button

仅仅是ASP.NET控件开发学习,仅仅是学习,不是重复造轮子。ASP.NET服务器控件已经有Button,而我写的这个控件仅仅实现提交功能 Code[DefaultEvent("Click")]publicclassRosanshaoButton:WebControl,IPostBackEventHandler{privatestaticreadonly...

weixin_30814319的博客 144

几个asp.net button样式

http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> http://www.w3.org/1999/xhtml" >     无标题页     .btn {     border-right:

smileberry1的专栏 1万+

ASP.NET中用<button>组件实现图片按钮,并添加点击事件和鼠标停在上面会改变样式

ASP.NET中添加带有图像和文字的按钮,文字和图像是一个整体,不管是鼠标悬停效果还是点击触发事件的区域都把文字和图像看作是一个整体

qq_44785454的博客 3209

asp.net button 提交前验证

js: <script type="text/javascript"> function test() { var isCheck = document.getElementById('checkbox').checked; if (isCheck) { ...

dianzhou9234的博客 424

asp.net: 点击<asp:button/>按钮时有时不能立即执行问题

最近开始接触asp:net,准备尝试写一个自己的网址,边做边了解,在做登录和注册的时候遇到一个小问题:

CrakerWei的博客 885
上一篇: ASP.NET进阶(4):认识Page类吗?
下一篇: ASP.NET进阶(6):认清控件 之 Render
maddemon
博客等级 码龄23年 123粉丝 42原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值