虽然是aspx文件,浏览器所显示的其实是一个html,那么当点击一个服务器端的button,其实是submit该页到服务器,那么服务器怎么判断哪个按钮被点击了,应该执行哪个按钮的click事件?

解决方案 »

  1.   

    提交数据给服务器的时候可以带一个btn的id
      

  2.   

    有ID的UniqueID,你放心,不会迷路的
      

  3.   

    客户端点按钮,会触发javascript的_doPostback()方法,提交表单,提交时包含一个eventTarget的参数,里面就是控件id
      

  4.   

    Button b = sender as Button;
    string buttonID = b.ID;
      

  5.   

    Get control name in Page_Load event which make the post back 
    http://geekswithblogs.net/mahesh/archive/2006/06/27/83264.aspx
      

  6.   

    Page 中的用 Page.Request.Params["__EVENTTARGET"]
    GirdView ,DataList 等控件中 用 Request.Params ["__EVENTARGUMENT"]
      

  7.   

    是利用javascript,每个按钮都有一个ID,有其相对应的JS函数,按一下个按钮时,触发对应的JS,则传回数据时就会有标识是哪个按钮被触发了 
      

  8.   

    sure?
    我觉得是带name,而不是id
      

  9.   

    如果是提交按钮的话.Request.Form["提交按钮的name"]是不为空的.
     
      

  10.   

    你的button有ID(asp)把 或 Name(vb)就是拿这个判断的
      

  11.   

    谢谢楼上的各位朋友.我的服务近件 Button对应的是 <input type="submit" ..>  所以用 Request.Form["__EVENTTARGET"]不行.
    我知道其它的控件可以用这个获取控件对象. 如:<input type="button" ..>补充.子类有多个Button
    基类不知子类Button名是什么基类有一方法获取子类某个Button控制引发PostBack了,再给Button绑字事件.
    Button执行相关代码.
      

  12.   

    代码如下:
    基类:
    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>
      

  13.   

    javascript:__doPostBack('LinkButton1','')
    如果是这种方式提交的,Request.Form["__EVENTTARGET"]可以获取到的.
    如果是提交按钮,能获取到name,而不是id
      

  14.   

        //按钮事件处理
        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;
            }    }
    //  所有按钮都可以使用该事件
      

  15.   

    Request.Form["__EVENTTARGET"] 不适用于由服务器Button生成的<input type="submit" name="btnQuery" id="btnQuery" value="查询">
      

  16.   

    是做asp.net开的.
    某一个基类实现某一特定的功能.
    那么所有从这基类继承的子类无需编码,只做界面,即可实现基功能.
      

  17.   

    .net特性之一,事件委托。
    在你添加给button的服务器端的onclick事件时,会将事件的处理委托给事件处理函数,函数有会接受到发起事件的控件信息及发起时间状态信息。
      

  18.   

    http://blog.csdn.net/kucool/archive/2007/11/22/1898116.aspx
      

  19.   

    你的意思是不是说把多个按钮注册到一个时间上了?你把sender参数转换成button类型,然后里面东西很多,有你用的
      

  20.   

    js 里的代码 可以看到 为_dopostback()的函数 里面的两个参数 就是可以知道了
    你可以重写 postback 
      

  21.   

    貌似vs2005里面生成的客户端html代码中没有__doPostBack和__EVENTTARGET这样的东西了吧,反正我是没找到
      

  22.   

    为什么不把我给你的代码写到你的基类里试一试呢?senser是事件源,包含提交数据的页面所有对象
      

  23.   

    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文件,因我不需要此文件.所有功能在基类中已经现实了.
      

  24.   

    设计架构要从高层次做起,才可靠。好的开发人员从底层了解系统,从高层次着手写代码;那种对架构了解不深,但是动不动就喜欢写低级代码来炫耀知道一些“技术点”的开发员,写出来的东西可以临时应付客户,但是不能成为一个产品继续使用它。我不知道你的目的是什么,但是设计思路似乎毫无原则性可言,不像是谨慎选择、沉淀出来的架构设计方法。如果是沉淀出来的原则虽然一样好用,但一定是自我约束而不是炫耀淫巧之术的。顺便说说你的最初的问题,确实不是什么PostEvent都通过 __EVENTTARGET 传递的。实际上,浏览器在那种时候仅仅是给Button的控件传值,这首先引起页面的PostData。但是asp.net的页面有点诡异,如果一个从客户端PostData过来的控件,它竟然不具有IPostBackDataHandler接口,但是具有IPostBackEventHandler接口,它就会在随后页面处理PostEvent的时候处理这个控件的PostbackEvent,而即使 __EVENTTARGET 中有值也不会执行(更何况你所看到的那个并没有值)。看完这个,还要回到我的主题。设计你的架构从高层着手编程,不要玩底层。底层用来研究,但是底层永远是变动做频繁的。这年头,有近百万自认为是程序员的人都找不到工作呢,所以开发人员到处都是。真正重要的是掌握通讯协议、系统架构,而底层开发人员可以找很多,让他们根据协议、架构文档来开发,然后进行各种服务、客户端的兼容性,谁开发的好就用谁的程序,别人的程序就丢掉。不要知道一点底层的开发知识就拼命用。产品中越是底层的东西其变动越快,这样才是畅销产品,那种仅懂得一点底层知识就成为产品经理的,大概其产品是垄断行业的产品。
      

  25.   

    ......我在群里讨论的结果是:用一个不可见的LABEL,存储文本,点某个按钮,文本发生变化,然后根据文本的内容判断点击的是哪个按钮。
      

  26.   

    所谓按钮事件处理程序实际上就是一个函数,只不过它接收了两个参数:
    object sender, System.EventArgs e
    sender比较抽象,但是它确实包含了不少东西
      

  27.   

    小弟我就写写小小的ASP.NET简单的程序,就是数据库读写查询之类的.所谓的架构确实不甚了解.如各位有什么好的书籍与网站,不防推荐推荐.
    数据库读写查询的太烦琐.就想写几个基类,现实所的查询,显示,保存操作.比如 查询的 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);
        } 
    }子类从这类继承.就不用写代码了.
    因项目中的查询太多.所以基类就完成了所有的查询功能.子类只有界面.
      

  28.   


    这知这位仁兄所说的父子颠倒是什么意思?
    在asp.net中如果子类没有.cs而从基类继承的话,那么基类就成了他的.cs.所以在加载时,它与ASPX合并为一个文件,那么基类的所有方法,与操作,就是相对自己的操作了.
      

  29.   


    这位仁兄,你就不用再sender了.我知道 按钮事件有两个参,object sender 触发事件的对象, 是可以转化为那个对象的.,EventArgs e是对象所带的参数.还是没看懂我的题意.基类只有找到了子类的某控件PostBack,再给这个对象注册事件,然后执行代码.
    现在是基类不知道是那个控件PostBack,所以没给它注册事件,就不存object sender 了.
      

  30.   

    接收跨页传值的方法应该可以解决楼主的问题…当单击子页面的按钮的时候,首先进入子页面的onload事件,进入按钮的单击事件 ,进入基类的onload事件,也就是说从子页面总是会进入母板页的onload事
    件,这个相当于页面的回传,可理解为跨页传递更好…然后在母版页的onload事件中通过
    PreviousPage.FindControl("btnQuery"),来寻找控件,然后转换一下就可以了…这个方法只能说,请楼主自个试一试
      

  31.   


    因子页有多种查询方案,所以PreviousPage.FindControl("btnQuery")只能找到一个Button.也可能不是点击这个醒询按钮.
      

  32.   

    每个button都由自己的click事件,你单击的是哪个button相应的就调用哪个button的click事件,所以这个不需要我们去关心的。你只要在对应的click事件里面写对应的代码即可。
      

  33.   

    Page.Request.Form.AllKeys[Page.Request.Form.AllKeys.Length - 1]
    试试这个,这将返回所点击控件的ClientID,然后截取最后$之后的内容就是你要的了。
    当然实际过程肯定不是一个方法就能表示清楚的,这个仅仅是用来解决你所说的问题。
      

  34.   

    如果是服务器控件,Button是自动回传的
      

  35.   

    btntype btn=(btntype)sender
    sender.id这样可以知道事件源。