2011-08-15 99 views
0

我有一个网页一些下拉控制,我不能绑定事件茨艾伦动态创建的控件 这里是我的代码:问题事件绑定到动态创建的控件

test21.aspx

enter code here 

<%@ Page Language="C#" AutoEventWireup="true" CodeFile="test21.aspx.cs" Inherits="test21" %> 

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> 

<html xmlns="http://www.w3.org/1999/xhtml"> 
<head runat="server"> 
    <title></title><script type="text/javascript"> 

     function BindEvents() { 
      $(document).ready(function() { 
       $(".tr-base").mouseover(function() { 
        $(this).toggleClass("trHover"); 
       }).mouseout(function() { 
        $(this).removeClass("trHover"); 
       }); 
     } 
</script> 
</head> 
<body> 
    <form id="form1" runat="server"> 
    <div> 
    <asp:ScriptManager ID="ScriptManager1" runat="server" ></asp:ScriptManager> 
    <asp:UpdatePanel runat="server" ID="UpdatePanel1"> 
    <ContentTemplate> 

    <asp:Panel ID="pnlDropDownList1" runat="server"> 
     </asp:Panel> 
      <script type="text/javascript"> 
       Sys.Application.add_load(BindEvents); 
    </script> 

    </ContentTemplate> 

    </asp:UpdatePanel> 


    </div> 

    </form> 
</body> 
</html> 

这里是aspx.cs

enter code here 
using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Web; 
using System.Web.UI; 
using System.Web.UI.WebControls; 

public partial class test21 : System.Web.UI.Page 
{ 
    Panel pnlDropDownList; 

    // protected void Page_PreInit(object sender, EventArgs e) 
     protected override void OnInit(EventArgs e) 
    { 


     //Create a Dynamic Panel 
     pnlDropDownList = new Panel(); 
     pnlDropDownList.ID = "pnlDropDownList"; 
     pnlDropDownList.BorderWidth = 1; 
     pnlDropDownList.Width = 300; 
     // this.form1.Controls.Add(pnlDropDownList); 


     //Create a LinkDynamic Button to Add TextBoxes 
     LinkButton btnAddDdl = new LinkButton(); 
     btnAddDdl.ID = "btnAddDdl"; 
     btnAddDdl.Text = "Add DropDownList"; 
     btnAddDdl.Click += new System.EventHandler(btnAdd_Click); 
    // this.form1.Controls.Add(btnAddDdl); 

     this.pnlDropDownList1.Controls.Add(pnlDropDownList); 

     //Recreate Controls 
     RecreateControls("ddlDynamic", "DropDownList"); 

     base.OnInit(e); 
    } 

    protected void btnAdd_Click(object sender, EventArgs e) 
    { 
     DropDownList sr = (DropDownList)sender; 

      int cnt = FindDropDownNumber("ddlDynamic"); 
      CreateDropDownList("ddlDynamic-" + Convert.ToString(cnt + 1)); 


    } 

    private int FindDropDownNumber(string substr) 
    { 
     //الهدف من هذه الفنكشن هو معرفة الرقم الملحق باسم الدروب داون لست 
     string reqstr = Request.Form.ToString(); 
     return ((reqstr.Length - reqstr.Replace(substr, "").Length)/ substr.Length); 

    } 

    private void CreateDropDownList(string ID) 
    { 

     DropDownList ddl = new DropDownList(); 

     ddl.ID = ID; 
     ddl.Items.Add(new ListItem("--Select--", "")); 
     ddl.Items.Add(new ListItem("One", "1")); 
     ddl.Items.Add(new ListItem("Two", "2")); 
     ddl.Items.Add(new ListItem("Three", "3")); 
     ddl.AutoPostBack = true; 
     ddl.SelectedIndexChanged += new EventHandler(OnSelectedIndexChanged); 

     pnlDropDownList.Controls.Add(ddl); 
     //ClientScript.RegisterClientScriptBlock(this.GetType(), "Alert", 
     //    "<script type = 'text/javascript'> alert('" + ID + 
     //    " fired SelectedIndexChanged event');</script>"); 





     Literal lt = new Literal(); 
     lt.Text = "<br />"; 
     pnlDropDownList.Controls.Add(lt); 
    } 
    protected void OnSelectedIndexChanged(object sender, EventArgs e) 
    { 

     DropDownList ddl = (DropDownList)sender; 
     string ID = ddl.ID; 

     btnAdd_Click(sender, e); 


     //Place the functionality here 

    } 
    private void RecreateControls(string ctrlPrefix, string ctrlType) 
    { 

     string[] ctrls = Request.Form.ToString().Split('&'); 

     int cnt = FindDropDownNumber(ctrlPrefix); 

     if (cnt > 0) 
     { 

      for (int k = 1; k <= cnt; k++) 
      { 

       for (int i = 0; i < ctrls.Length; i++) 
       { 

        if (ctrls[i].Contains(ctrlPrefix + "-" + k.ToString()) 

         && !ctrls[i].Contains("EVENTTARGET")) 
        { 

         string ctrlID = ctrls[i].Split('=')[0]; 



         if (ctrlType == "DropDownList") 
         { 

          CreateDropDownList(ctrlID); 

         } 

         break; 

        } 

       } 

      } 

     } 

    } 



    protected void Page_Load(object sender, EventArgs e) 
    { 
     if(!IsPostBack) 
     { 
     DropDownList ddlDynamicini = new DropDownList(); 
     ddlDynamicini.ID = "ddlDynamic-1"; 


     ddlDynamicini.Items.Add(new ListItem("--Select--", "")); 
     ddlDynamicini.Items.Add(new ListItem("One", "1")); 
     ddlDynamicini.Items.Add(new ListItem("Two", "2")); 
     ddlDynamicini.Items.Add(new ListItem("Three", "3")); 
     ddlDynamicini.AutoPostBack = true; 
     ddlDynamicini.SelectedIndexChanged += new EventHandler(OnSelectedIndexChanged); 
     pnlDropDownList.Controls.Add(ddlDynamicini); 
     } 
    } 

} 

Anay帮助,请? :(

+0

你是指像onmouseover这样的JavaScript事件吗? –

+0

tr-base类在哪里被应用到你的DOM元素(正如Senad指出的那样,我认为你的意思是客户端事件)? – RoccoC5

回答

1

当页面最初加载该ready()功能只叫你想要的是每次的Ajax请求之后向事件附加,所以要使用live()功能。

编辑

我想你可以删除调用add_load和BindEvents功能,只是这样做:

$(document).ready(function() { 
    $(".tr-base").live("mouseover", function() { 
     $(this).toggleClass("trHover"); 
    }); 
    $(".tr-base").live("mouseout", (function() { 
     $(this).removeClass("trHover"); 
    }); 
} 

这是假设,当然,你的新ADDE d元素将具有“tr-base”类,这在我的代码示例中没有看到。

相关问题