我的意思如下:
我想根据用户的要求Response.Write一段HTML代码。。但是在这段代码里包含一个按钮(也可能没有)
我如何让这段Response到客户端的按钮响应一个我在服务器端已经定义好的事件??

解决方案 »

  1.   

    最好还是在服务器端生成吧Button bt = new Button();
    bt.Click += new EventHandler(bt_Click);
      

  2.   

    这几天有几人在问类似的问题,“动态加载控件,为什么控件事件不能触发了?”,问题是他们都是在if (!IsPostBack)
    {
            //动态产生或装载控件
            //也许需要连接控件事件处理函数
           //加到父控件的Controls
    }里生成或装载了动态控件。当控件在客户端触发,postback到服务器端时,IsPostBack==true,这些控件没有被重新生成,怎么能触发事件?所以答案是,当你需要动态生成或装载控件时,应该在if (!IsPostBack)之外做。我问为什么想在if (!IsPostBack)之内做呢?回答是想只生成一次,跟在ASPX页面里一样<form id="form1" runat=server>
    <asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>#%&%#&%^#&,你怎么会认为这个控件只生成一次呢?这些玩意也不是魔术,想生成一个Button对象,你需要用Button btn = new Button();需要触发它的Click事件,你需要用btn.Click += new EventHandler(YourHandler);即使象包含<asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>的页面,它也是被转化成C#或VB文件,编译成assembly,然后再被执行的啊不信?加一个页面,TestControls.aspx:<%@ Page Debug="true" %>
    <%@ Import Namespace="System.Data"%>
    <%@ Import Namespace="System.Data.SqlClient"%><form id="form1" runat=server>
    <asp:Button id="Button1" runat="server" Text="Button1" OnClick="Button_Click"/>
    <asp:DataGrid id="DataGrid1" runat="server" AutoGenerateColumns="false" GridLines="Both">
    <Columns>
     <asp:TemplateColumn HeaderText="Name">
     <ItemTemplate><%# DataBinder.Eval(Container.DataItem,"Name")%></ItemTemplate>
     </asp:TemplateColumn>
    </Columns>
    </asp:DataGrid>
    </form>
    <script language="C#" runat="server">
    void Button_Click(Object sender, EventArgs e)
    {
      Button btn = (Button)sender;
      Response.Write(btn.Text + " is clicked<BR>");
    }void Page_Load(Object sender, EventArgs e)
    {
       
     Button btn = new Button();
     btn.ID = "Button2";
     btn.Text = "Button2";
     btn.Click += new EventHandler(Button_Click);
     form1.Controls.Add(btn);
       if (!IsPostBack)
       {
     SqlDataAdapter da = new SqlDataAdapter("select Name=au_fname + ' ' + au_lname from authors", "server=localhost;database=pubs;uid=sa;pwd=;");
     DataTable dt = new DataTable();
     da.Fill(dt);
     DataGrid1.DataSource = dt.DefaultView;
     DataGrid1.DataBind();
       }
     
    //}//这是故意的</script>把最后一个“}”注释掉
      

  3.   

    在后台代码里为按钮加一个attribute
      

  4.   

    问题是这个按钮的位置我也不清楚//所以不能事先用visible来指定
    这个按钮的位置是根据用户的一段html代码决定的比如
    <div>button<div>然后我就要在button这个位置生成这个可以响应服务器事件的按钮
    大家有没有遇到过这种问题?我想了好长时间也想不出来。。如果response.write一个input则因为是客户端生成的,没有办法响应服务器事件
      

  5.   

    <table width="460" border="0" cellpadding="10" cellspacing="0" class="nr-st-9pt-16line">
      <tr> 
        <td>
          <p>按钮位置</p>
          </td>
      </tr>
    </table>
    比如我根据用户要求,生成了这段html,我要在“按妞位置”这里生成一个按纽并添加一个服务器端的事件
      

  6.   

    我这儿有两种方法,你看合不合适:
    1、动态生成按钮,并给控件加事件,但是这种情况,当PostBack后按钮就消失了,其原因是服务器没有存这个控件的状态,也就是LoadViewState时没有它,那么我们需要重载一下LoadViewState事件,在这个事件中再添加这个控件就可以了。也就是 if (!Page.IsPostBack){动态添加控件,添加事件} ,Override LoadViewState(){再加这个控件和事件}
    2、另外一种方法,就是页面上放一个隐藏的服务器控件,不如一个TextBox,把它的宽度设为0(如果设Visible = false,那么服务器端不生成其Html,无法通过脚本控制它),PostBack属性设true,对这个TextBox写后台的onchange代码,你Response 出一个客户端按钮,对这个按钮的onclick写_doPostBack(服务器端TextBox,onchange)就可以了.
      

  7.   

    呵呵.我随带问一个问题.如题功能我已经做出来了.但是又出现一个新问题.自动生成了N个button但都指向一个click如何确定我是点了那一个button.
      

  8.   

    对于N个Button,如果是客户端那么就是event.srcElement了,如果是服务器端,那个object sender不就可以确定了吗?