Проблема привязки событий к динамически создаваемым элементам управления - PullRequest
0 голосов
/ 16 августа 2011

У меня есть страница с некоторыми выпадающими элементами управления, я не могу привязать события к этим динамически созданным элементам управления вот мой код:

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);
        }
    }

}

Ана, помогите пожалуйста ?? (

1 Ответ

1 голос
/ 16 августа 2011

Функция 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");
    });
}

Это предполагает, конечно, что у ваших недавно добавленных элементов будет класс "tr-base", которого я не видел в вашем примере кода.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...