Asp.net怎么知道那个按钮被点击了? 虽然是aspx文件,浏览器所显示的其实是一个html,那么当点击一个服务器端的button,其实是submit该页到服务器,那么服务器怎么判断哪个按钮被点击了,应该执行哪个按钮的click事件? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 提交数据给服务器的时候可以带一个btn的id 有ID的UniqueID,你放心,不会迷路的 客户端点按钮,会触发javascript的_doPostback()方法,提交表单,提交时包含一个eventTarget的参数,里面就是控件id Button b = sender as Button;string buttonID = b.ID; Get control name in Page_Load event which make the post back http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx Page 中的用 Page.Request.Params["__EVENTTARGET"]GirdView ,DataList 等控件中 用 Request.Params ["__EVENTARGUMENT"] 是利用javascript,每个按钮都有一个ID,有其相对应的JS函数,按一下个按钮时,触发对应的JS,则传回数据时就会有标识是哪个按钮被触发了 sure?我觉得是带name,而不是id 如果是提交按钮的话.Request.Form["提交按钮的name"]是不为空的. 你的button有ID(asp)把 或 Name(vb)就是拿这个判断的 谢谢楼上的各位朋友.我的服务近件 Button对应的是 <input type="submit" ..> 所以用 Request.Form["__EVENTTARGET"]不行.我知道其它的控件可以用这个获取控件对象. 如:<input type="button" ..>补充.子类有多个Button基类不知子类Button名是什么基类有一方法获取子类某个Button控制引发PostBack了,再给Button绑字事件.Button执行相关代码. 代码如下:基类:public class BasePage:Page{ public BasePage() { // // TODO: 在此处添加构造函数逻辑 // } protected override void OnLoad(EventArgs e) { //获取子类某Button控件 //赋给下面的 Button Button btn = new Button(); btn.Click += new EventHandler(btn_Click); } base.OnLoad(e); } void btn_Click(object sender, EventArgs e) { //调用业务代码; }}子类无需编码,只做界面.继承关系见红色.<%@ Page Language="C#" MasterPageFile="~/MasterPage/NormalPage.master" Inherits="BasePage" Title="注册用户查询" %><asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"><div style="margin:0 auto;text-align:center;height:430px"> <fieldset style="margin:0 auto;width:45%"> <legend > 注册用户查询</legend> <table style="margin:0 auto;"> <tr> <td style="width: 120px; height: 30px;"> Department</td> <td style="width: 300px; height: 30px;"> <asp:TextBox ID="txtDept" runat="server" Width="149px"></asp:TextBox></td> </tr> <tr> <td style="width: 120px; height: 30px;">UserId</td> <td style="width: 300px; height: 30px;"> <asp:TextBox ID="txtUserId" runat="server" Width="149px"></asp:TextBox></td> </tr> <tr> <td style="width: 120px; height: 30px;">UserName</td> <td style="width: 300px; height: 30px;"> <asp:TextBox ID="txtUserName" runat="server" Width="149px"></asp:TextBox></td> </tr> <tr> <td style="width: 120px; height: 30px;">Regist Date</td> <td style="width: 300px; height: 30px;"> <asp:TextBox ID="txtRegDate" runat="server" Width="149px"></asp:TextBox></td> </tr> <tr> <td colspan="2" style="text-align:center; height: 35px;"> <asp:Button ID="btnQuery" runat="server" Text="Query" Width="90px" BackColor="CornflowerBlue" BorderColor="CornflowerBlue" Height="27px" /></td> </tr> </table> <br /> <br /></fieldset> </div> javascript:__doPostBack('LinkButton1','')如果是这种方式提交的,Request.Form["__EVENTTARGET"]可以获取到的.如果是提交按钮,能获取到name,而不是id //按钮事件处理 protected void BtnClick(object sender, System.EventArgs e) { Button b = sender as Button; string buttonID = b.ID; switch (buttonID) { case "按钮1": // 做点什么; break; case "按钮2": // 做点什么; break; } } // 所有按钮都可以使用该事件 Request.Form["__EVENTTARGET"] 不适用于由服务器Button生成的<input type="submit" name="btnQuery" id="btnQuery" value="查询"> 是做asp.net开的.某一个基类实现某一特定的功能.那么所有从这基类继承的子类无需编码,只做界面,即可实现基功能. .net特性之一,事件委托。在你添加给button的服务器端的onclick事件时,会将事件的处理委托给事件处理函数,函数有会接受到发起事件的控件信息及发起时间状态信息。 http://blog.csdn.net/kucool/archive/2007/11/22/1898116.aspx 你的意思是不是说把多个按钮注册到一个时间上了?你把sender参数转换成button类型,然后里面东西很多,有你用的 js 里的代码 可以看到 为_dopostback()的函数 里面的两个参数 就是可以知道了你可以重写 postback 貌似vs2005里面生成的客户端html代码中没有__doPostBack和__EVENTTARGET这样的东西了吧,反正我是没找到 为什么不把我给你的代码写到你的基类里试一试呢?senser是事件源,包含提交数据的页面所有对象 asp.net PostBack有两种方式:第一种: submit 提交.由Button服务控件生成的 <input type="submit" .../>第二种: __doPostBack('控件名','参数')提交.由一般服务器控件生成的一脚本. 包括Button服务器控件生成的<input type="button" .../>很多朋友还没弄清我的问题.基类: BasePage.cs无aspx页面.实现某些功能. 基类OnLoad 代码: protected override void OnLoad(EventArgs e) { //问题..... //子类某一按钮被点击了,获取子类按钮的ID或Name 其它的也行. //子类控件ID.现在就是不知怎么获取子类控件ID???????? //下面就是. Button btn = null; btn =(Button) FindWebControl.FindControl(this.Page, "子类控件ID"); if (btn != null) { btn.Click += new EventHandler(btn_Click); } base.OnLoad(e); } void btn_Click(object sender, EventArgs e) { //事务代码. } 子类无.cs代码,仅做界面.aspx文件.<%@ Page Language="C#" MasterPageFile="~/MasterPage/NormalPage.master" Inherits="BasePage" Title="用户查询" %><asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server"><div style="margin:0 auto;text-align:center;height:430px"> <fieldset style="margin:0 auto;width:45%"> <legend style="background:url(../images/login.jpg) no-repeat 6px 50%; font-weight: bold; font-size: 16pt; color: royalblue; font-family: Arial;"> 用户查询</legend> <table style="margin:0 auto;"> <tr> <td style="width: 120px; height: 30px;"> Department</td> <td style="width: 300px; height: 30px;"> <asp:TextBox ID="txtDept" runat="server" Width="149px"></asp:TextBox></td> </tr> <tr> <td style="width: 120px; height: 30px;">UserId</td> <td style="width: 300px; height: 30px;"> <asp:TextBox ID="txtUserId" runat="server" Width="149px"></asp:TextBox></td> </tr> <tr> <td style="width: 120px; height: 30px;">UserName</td> <td style="width: 300px; height: 30px;"> <asp:TextBox ID="txtUserName" runat="server" Width="149px"></asp:TextBox></td> </tr> <tr> <td style="width: 120px; height: 30px;">Regist Date</td> <td style="width: 300px; height: 30px;"> <asp:TextBox ID="txtRegDate" runat="server" Width="149px"></asp:TextBox></td> </tr> <tr> <td colspan="2" style="text-align:center; height: 35px;"> <asp:Button ID="btnQuery" runat="server" Text="Query" Width="90px" BackColor="CornflowerBlue" BorderColor="CornflowerBlue" Height="27px" /></td> </tr> </table> <br /> <br /></fieldset> </div></asp:Content>凡子类从BasePage继承.不用写代码即可现实相关的功能.因此子类继承方式只能在aspx里写 Inherits="BasePage"上面很多朋友说用.sender不知是从何而来.因子类没.cs文件,因我不需要此文件.所有功能在基类中已经现实了. 设计架构要从高层次做起,才可靠。好的开发人员从底层了解系统,从高层次着手写代码;那种对架构了解不深,但是动不动就喜欢写低级代码来炫耀知道一些“技术点”的开发员,写出来的东西可以临时应付客户,但是不能成为一个产品继续使用它。我不知道你的目的是什么,但是设计思路似乎毫无原则性可言,不像是谨慎选择、沉淀出来的架构设计方法。如果是沉淀出来的原则虽然一样好用,但一定是自我约束而不是炫耀淫巧之术的。顺便说说你的最初的问题,确实不是什么PostEvent都通过 __EVENTTARGET 传递的。实际上,浏览器在那种时候仅仅是给Button的控件传值,这首先引起页面的PostData。但是asp.net的页面有点诡异,如果一个从客户端PostData过来的控件,它竟然不具有IPostBackDataHandler接口,但是具有IPostBackEventHandler接口,它就会在随后页面处理PostEvent的时候处理这个控件的PostbackEvent,而即使 __EVENTTARGET 中有值也不会执行(更何况你所看到的那个并没有值)。看完这个,还要回到我的主题。设计你的架构从高层着手编程,不要玩底层。底层用来研究,但是底层永远是变动做频繁的。这年头,有近百万自认为是程序员的人都找不到工作呢,所以开发人员到处都是。真正重要的是掌握通讯协议、系统架构,而底层开发人员可以找很多,让他们根据协议、架构文档来开发,然后进行各种服务、客户端的兼容性,谁开发的好就用谁的程序,别人的程序就丢掉。不要知道一点底层的开发知识就拼命用。产品中越是底层的东西其变动越快,这样才是畅销产品,那种仅懂得一点底层知识就成为产品经理的,大概其产品是垄断行业的产品。 ......我在群里讨论的结果是:用一个不可见的LABEL,存储文本,点某个按钮,文本发生变化,然后根据文本的内容判断点击的是哪个按钮。 所谓按钮事件处理程序实际上就是一个函数,只不过它接收了两个参数:object sender, System.EventArgs esender比较抽象,但是它确实包含了不少东西 小弟我就写写小小的ASP.NET简单的程序,就是数据库读写查询之类的.所谓的架构确实不甚了解.如各位有什么好的书籍与网站,不防推荐推荐.数据库读写查询的太烦琐.就想写几个基类,现实所的查询,显示,保存操作.比如 查询的 DataQueryPage,数据显示的.DataShowPage, 数据操作的DataOperatePage.子类就做界面.不用写代码了.基本思路就这样了.拿一个查询的来说说吧DataQueryPage.cspublic Class DataQueryPage:Page{ protected override void OnLoad(EventArgs e) { //问题..... //子类某一按钮被点击了,获取子类按钮的ID或Name 其它的也行. //子类控件ID.现在就是不知怎么获取子类控件ID???????? //下面就是. Button btnQuery = null; btnQuery =(Button) FindWebControl.FindControl(this.Page, "子类控件ID"); if (btnQuery != null) { btnQuery.Click += new EventHandler(btnQuery_Click); } base.OnLoad(e); } void btnQuery_Click(object sender, EventArgs e) { // 有一个封装好的类. DataOperate dataOperate=new DataOperate (); dataOperate.Query(this.Page); } }子类从这类继承.就不用写代码了.因项目中的查询太多.所以基类就完成了所有的查询功能.子类只有界面. 这知这位仁兄所说的父子颠倒是什么意思?在asp.net中如果子类没有.cs而从基类继承的话,那么基类就成了他的.cs.所以在加载时,它与ASPX合并为一个文件,那么基类的所有方法,与操作,就是相对自己的操作了. 这位仁兄,你就不用再sender了.我知道 按钮事件有两个参,object sender 触发事件的对象, 是可以转化为那个对象的.,EventArgs e是对象所带的参数.还是没看懂我的题意.基类只有找到了子类的某控件PostBack,再给这个对象注册事件,然后执行代码.现在是基类不知道是那个控件PostBack,所以没给它注册事件,就不存object sender 了. 接收跨页传值的方法应该可以解决楼主的问题…当单击子页面的按钮的时候,首先进入子页面的onload事件,进入按钮的单击事件 ,进入基类的onload事件,也就是说从子页面总是会进入母板页的onload事件,这个相当于页面的回传,可理解为跨页传递更好…然后在母版页的onload事件中通过PreviousPage.FindControl("btnQuery"),来寻找控件,然后转换一下就可以了…这个方法只能说,请楼主自个试一试 因子页有多种查询方案,所以PreviousPage.FindControl("btnQuery")只能找到一个Button.也可能不是点击这个醒询按钮. 每个button都由自己的click事件,你单击的是哪个button相应的就调用哪个button的click事件,所以这个不需要我们去关心的。你只要在对应的click事件里面写对应的代码即可。 Page.Request.Form.AllKeys[Page.Request.Form.AllKeys.Length - 1]试试这个,这将返回所点击控件的ClientID,然后截取最后$之后的内容就是你要的了。当然实际过程肯定不是一个方法就能表示清楚的,这个仅仅是用来解决你所说的问题。 如果是服务器控件,Button是自动回传的 btntype btn=(btntype)sendersender.id这样可以知道事件源。 反射的好处,最好有实例通俗易懂。 关于服务器端注册的脚本的位置 最近一直在学extjs的东东,一直有个问题得不到解决,请指点一二,谢谢 方法如何返回多个类型 问个超级菜的问题,关于datagrid控件的。 正则表达式 datagrid的小问题。大家帮帮我吧!别没人回答啊! 帮个忙解决.net uploadify io erro问题 思归大哥请帮忙 :(怎么老是重起了?? 点击按钮之后,后台执行比较耗时的代码,同时在网页提示处理中请等待的效果,执行完毕后消失提示? 求教关于项目测试!
string buttonID = b.ID;
http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx
GirdView ,DataList 等控件中 用 Request.Params ["__EVENTARGUMENT"]
我觉得是带name,而不是id
我知道其它的控件可以用这个获取控件对象. 如:<input type="button" ..>补充.子类有多个Button
基类不知子类Button名是什么基类有一方法获取子类某个Button控制引发PostBack了,再给Button绑字事件.
Button执行相关代码.
基类:
public class BasePage:Page
{
public BasePage()
{
//
// TODO: 在此处添加构造函数逻辑
//
} protected override void OnLoad(EventArgs e)
{
//获取子类某Button控件
//赋给下面的 Button
Button btn = new Button();
btn.Click += new EventHandler(btn_Click);
} base.OnLoad(e);
} void btn_Click(object sender, EventArgs e)
{
//调用业务代码;
}
}子类无需编码,只做界面.继承关系见红色.<%@ Page Language="C#" MasterPageFile="~/MasterPage/NormalPage.master" Inherits="BasePage" Title="注册用户查询" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<div style="margin:0 auto;text-align:center;height:430px">
<fieldset style="margin:0 auto;width:45%">
<legend > 注册用户查询</legend>
<table style="margin:0 auto;">
<tr>
<td style="width: 120px; height: 30px;">
Department</td>
<td style="width: 300px; height: 30px;">
<asp:TextBox ID="txtDept" runat="server" Width="149px"></asp:TextBox></td>
</tr>
<tr>
<td style="width: 120px; height: 30px;">UserId</td>
<td style="width: 300px; height: 30px;">
<asp:TextBox ID="txtUserId" runat="server" Width="149px"></asp:TextBox></td>
</tr> <tr>
<td style="width: 120px; height: 30px;">UserName</td>
<td style="width: 300px; height: 30px;">
<asp:TextBox ID="txtUserName" runat="server" Width="149px"></asp:TextBox></td>
</tr>
<tr>
<td style="width: 120px; height: 30px;">Regist Date</td>
<td style="width: 300px; height: 30px;">
<asp:TextBox ID="txtRegDate" runat="server" Width="149px"></asp:TextBox></td>
</tr>
<tr>
<td colspan="2" style="text-align:center; height: 35px;">
<asp:Button ID="btnQuery" runat="server" Text="Query" Width="90px" BackColor="CornflowerBlue" BorderColor="CornflowerBlue" Height="27px" /></td>
</tr> </table>
<br /> <br /></fieldset>
</div>
如果是这种方式提交的,Request.Form["__EVENTTARGET"]可以获取到的.
如果是提交按钮,能获取到name,而不是id
protected void BtnClick(object sender, System.EventArgs e)
{
Button b = sender as Button;
string buttonID = b.ID;
switch (buttonID)
{
case "按钮1":
// 做点什么;
break;
case "按钮2":
// 做点什么;
break;
} }
// 所有按钮都可以使用该事件
某一个基类实现某一特定的功能.
那么所有从这基类继承的子类无需编码,只做界面,即可实现基功能.
在你添加给button的服务器端的onclick事件时,会将事件的处理委托给事件处理函数,函数有会接受到发起事件的控件信息及发起时间状态信息。
你可以重写 postback
第一种:
submit 提交.由Button服务控件生成的 <input type="submit" .../>
第二种:
__doPostBack('控件名','参数')提交.由一般服务器控件生成的一脚本.
包括Button服务器控件生成的<input type="button" .../>
很多朋友还没弄清我的问题.基类:
BasePage.cs无aspx页面.实现某些功能. 基类OnLoad 代码:
protected override void OnLoad(EventArgs e)
{
//问题.....
//子类某一按钮被点击了,获取子类按钮的ID或Name 其它的也行. //子类控件ID.现在就是不知怎么获取子类控件ID????????
//下面就是. Button btn = null;
btn =(Button) FindWebControl.FindControl(this.Page, "子类控件ID");
if (btn != null)
{
btn.Click += new EventHandler(btn_Click); }
base.OnLoad(e);
} void btn_Click(object sender, EventArgs e)
{
//事务代码.
}
子类无.cs代码,仅做界面.aspx文件.
<%@ Page Language="C#" MasterPageFile="~/MasterPage/NormalPage.master" Inherits="BasePage" Title="用户查询" %>
<asp:Content ID="Content1" ContentPlaceHolderID="ContentPlaceHolder1" Runat="Server">
<div style="margin:0 auto;text-align:center;height:430px">
<fieldset style="margin:0 auto;width:45%">
<legend style="background:url(../images/login.jpg) no-repeat 6px 50%; font-weight: bold; font-size: 16pt; color: royalblue; font-family: Arial;">
用户查询</legend>
<table style="margin:0 auto;">
<tr>
<td style="width: 120px; height: 30px;">
Department</td>
<td style="width: 300px; height: 30px;">
<asp:TextBox ID="txtDept" runat="server" Width="149px"></asp:TextBox></td>
</tr>
<tr>
<td style="width: 120px; height: 30px;">UserId</td>
<td style="width: 300px; height: 30px;">
<asp:TextBox ID="txtUserId" runat="server" Width="149px"></asp:TextBox></td>
</tr> <tr>
<td style="width: 120px; height: 30px;">UserName</td>
<td style="width: 300px; height: 30px;">
<asp:TextBox ID="txtUserName" runat="server" Width="149px"></asp:TextBox></td>
</tr>
<tr>
<td style="width: 120px; height: 30px;">Regist Date</td>
<td style="width: 300px; height: 30px;">
<asp:TextBox ID="txtRegDate" runat="server" Width="149px"></asp:TextBox></td>
</tr>
<tr>
<td colspan="2" style="text-align:center; height: 35px;">
<asp:Button ID="btnQuery" runat="server" Text="Query" Width="90px" BackColor="CornflowerBlue" BorderColor="CornflowerBlue" Height="27px" /></td>
</tr> </table>
<br /> <br /></fieldset> </div>
</asp:Content>凡子类从BasePage继承.不用写代码即可现实相关的功能.因此子类继承方式只能在aspx里写 Inherits="BasePage"
上面很多朋友说用.sender不知是从何而来.因子类没.cs文件,因我不需要此文件.所有功能在基类中已经现实了.
object sender, System.EventArgs e
sender比较抽象,但是它确实包含了不少东西
数据库读写查询的太烦琐.就想写几个基类,现实所的查询,显示,保存操作.比如 查询的 DataQueryPage,数据显示的.DataShowPage, 数据操作的DataOperatePage.子类就做界面.不用写代码了.基本思路就这样了.拿一个查询的来说说吧DataQueryPage.cs
public Class DataQueryPage:Page
{
protected override void OnLoad(EventArgs e)
{
//问题.....
//子类某一按钮被点击了,获取子类按钮的ID或Name 其它的也行. //子类控件ID.现在就是不知怎么获取子类控件ID????????
//下面就是. Button btnQuery = null;
btnQuery =(Button) FindWebControl.FindControl(this.Page, "子类控件ID");
if (btnQuery != null)
{
btnQuery.Click += new EventHandler(btnQuery_Click); }
base.OnLoad(e);
} void btnQuery_Click(object sender, EventArgs e)
{
// 有一个封装好的类.
DataOperate dataOperate=new DataOperate ();
dataOperate.Query(this.Page);
}
}子类从这类继承.就不用写代码了.
因项目中的查询太多.所以基类就完成了所有的查询功能.子类只有界面.
这知这位仁兄所说的父子颠倒是什么意思?
在asp.net中如果子类没有.cs而从基类继承的话,那么基类就成了他的.cs.所以在加载时,它与ASPX合并为一个文件,那么基类的所有方法,与操作,就是相对自己的操作了.
这位仁兄,你就不用再sender了.我知道 按钮事件有两个参,object sender 触发事件的对象, 是可以转化为那个对象的.,EventArgs e是对象所带的参数.还是没看懂我的题意.基类只有找到了子类的某控件PostBack,再给这个对象注册事件,然后执行代码.
现在是基类不知道是那个控件PostBack,所以没给它注册事件,就不存object sender 了.
件,这个相当于页面的回传,可理解为跨页传递更好…然后在母版页的onload事件中通过
PreviousPage.FindControl("btnQuery"),来寻找控件,然后转换一下就可以了…这个方法只能说,请楼主自个试一试
因子页有多种查询方案,所以PreviousPage.FindControl("btnQuery")只能找到一个Button.也可能不是点击这个醒询按钮.
试试这个,这将返回所点击控件的ClientID,然后截取最后$之后的内容就是你要的了。
当然实际过程肯定不是一个方法就能表示清楚的,这个仅仅是用来解决你所说的问题。
sender.id这样可以知道事件源。