Btn.Command +=new CommandEventHandler(OnBtnClick);private void OnBtnClick(object sender, CommandEventArgs e)
{
    
}

解决方案 »

  1.   


    this.bt_post.Click += new System.EventHandler(this.bt_post_Click);
    private void bt_post_Click(object sender, System.EventArgs e)
      

  2.   

    两个星级专家的答案,IS OK
      

  3.   

    这几天有几人在问类似的问题,“动态加载控件,为什么控件事件不能触发了?”,问题是他们都是在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>把最后一个“}”注释掉,然后在浏览器里向你的服务器调用TestControls.aspx
      

  4.   

    net_lover(孟子E章),goody9807() 多谢你们的指教!我用的是vb呀,不是c
    能给出vb的方法吗?尽量详细点,谢谢!
      

  5.   


    AddHandler bt_post.Click, New EventHandler(AddressOf bt_post_Click)
      

  6.   

    我现在动态生成了N个button,每个button都需要自己的事件函数,怎么解决呢?
      

  7.   

    this.bt_post.Click += new System.EventHandler(this.bt_post_Click);
    private void bt_post_Click(object sender, System.EventArgs e)委托,顾名思义将某个控件的某个事件交给一个处理函数去做
    this.bt_post.Click += new System.EventHandler(this.bt_post_Click);
    具体怎么做,也就是你要写的事件处理过程
    private void bt_post_Click(object sender, System.EventArgs e)
      

  8.   


    TO:我现在动态生成了N个button,每个button都需要自己的事件函数,怎么解决呢?
    可以委托给不同的函数,也可以委托给一个函数,根据sender.commandName来判断是哪个Button 触发的,再相应处理
      

  9.   

    通过循环,现在生成了dropdownlist两个,分别叫dl1,dl2
                    n_dropdownlist = New DropDownList
                    n_dropdownlist.ID = "dl" + dr("id")    
                    n_dropdownlist.AutoPostBack = True
                    Dim item0 As New ListItem
                    Dim item1 As New ListItem
                    item0.Text = dr("mc")
                    item0.Value = dr("id")
                    item1.Text = "OOOKKK"
                    item1.Value = "OOOKKK"
                    item2.Text = "XXXXXXX"
                    item2.Value = "XXXXXX"
                    n_dropdownlist.Items.Add(item0)
                    n_dropdownlist.Items.Add(item1)
                    n_dropdownlist.Items.Add(item2)
                    PlaceHolder1.Controls.Add(n_dropdownlist)我想分别指定他们的事件函数,请指教..
      

  10.   

    Sub Button_Click(sender As [Object], e As EventArgs)
       Dim btn As Button = CType(sender, Button)
       Response.Write((btn.Text + " is clicked<BR>"))
    End Sub 'Button_Click
    Sub Page_Load(sender As [Object], e As EventArgs)
       
       Dim btn As New Button()
       btn.ID = "Button2"
       btn.Text = "Button2"
       AddHandler btn.Click, AddressOf Button_Click
       form1.Controls.Add(btn)
       If Not IsPostBack Then
          Dim da As New SqlDataAdapter("select Name=au_fname + ' ' + au_lname from authors", "server=localhost;database=pubs;uid=sa;pwd=;")
          Dim dt As New DataTable()
          da.Fill(dt)
          DataGrid1.DataSource = dt.DefaultView
          DataGrid1.DataBind()
       End If
    End Sub 'Page_Load
      

  11.   

    to goody9807() 
    谢谢你的回复,还有几个地方不明白:
    一、btn不用withevent吗?dim btn as new button()这样就可以?
    二、假如有两个button怎么解决?
      

  12.   

    to zilang(紫狼)
    你能把怎么委托写详细点吗?谢谢!
      

  13.   

    <html>
    <head>
       <script runat="server" language="vb">
          Sub r_Click(sender As Object, e As EventArgs) 
             Label1.Text = (CType(sender,Button)).Text
          End Sub
          Sub Page_Load(sender As Object, e As EventArgs)
          Dim j As Integer
    For j = 1 To 6
      Dim r As New Button()
      r.Text="我是Button " + j.ToString()
      r.ID = "ID" + j.ToString()
      AddHandler r.Click, New EventHandler(AddressOf r_Click)
      m.Controls.Add(r)
      Next j   
          End Sub
       </script>
    </head>
    <body>
       <form runat="server" id="m">
       <asp:Label id=Label1 runat="server"/> 
       </form>
    </body>
    </html>
      

  14.   

    为什么当我selectchange两次动态生成的dropdownlist以后会出现下面的错误,怎么解决?:
    ------------------------------------
    System.Web.HttpException: 未能加载视图状态。正在向其中加载视图状态的控件树必须与前一请求期间用于保存视图状态的控件树相匹配。
    例如,当以动态方式添加控件时,在回发期间添加的控件必须与在初始请求期间添加的控件的类型和位置相匹配。 
    at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) 
    at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) 
    at System.Web.UI.Control.LoadViewStateRecursive(Object savedState) 
    at System.Web.UI.Control.AddedControl(Control control, Int32 index) 
    at System.Web.UI.ControlCollection.Add(Control child) 
    at System.Web.UI.WebControls.RowControlCollection.Add(Control child) 
    at System.Web.UI.ControlCollection.AddAt(Int32 index, Control child) 
    at System.Web.UI.WebControls.RowControlCollection.AddAt(Int32 index, Control child) 
    at System.Web.UI.WebControls.TableRowCollection.AddAt(Int32 index, TableRow row) a
    t System.Web.UI.WebControls.TableRowCollection.Add(TableRow row) 
    at vs_sbmis.creat.Page_Load(Object sender, EventArgs e) in D:\sbmis\vs-sbmis\creat.aspx.vb:line 149