Asp.net 动态创建的链接按钮的OnClick事件不起作用

Asp.net 动态创建的链接按钮的OnClick事件不起作用,asp.net,ajax,onclick,modalpopupextender,linkbutton,Asp.net,Ajax,Onclick,Modalpopupextender,Linkbutton,我试过几种解决这个问题的方法,但都不管用。 基本上,我有一个员工表,用户可以选择通过更新面板动态添加员工。每个员工都将被添加为链接按钮,此按钮将通过单击事件启动ajaxToolkit:ModalPopupXtender窗口,该窗口将显示员工详细信息。 问题是,当我单击员工姓名时,弹出窗口将显示,但详细信息不会显示 下面是我创建按钮并将其放入表中的代码: LinkButton lbtn = new LinkButton(); lbtn.ID = employ

我试过几种解决这个问题的方法,但都不管用。 基本上,我有一个员工表,用户可以选择通过更新面板动态添加员工。每个员工都将被添加为链接按钮,此按钮将通过单击事件启动ajaxToolkit:ModalPopupXtender窗口,该窗口将显示员工详细信息。 问题是,当我单击员工姓名时,弹出窗口将显示,但详细信息不会显示

下面是我创建按钮并将其放入表中的代码:

LinkButton lbtn = new LinkButton();
                    lbtn.ID = employee_arry[i] + "_lbtn" + i;
                    lbtn.Text = employee_arry[i];
                    lbtn.Click += new EventHandler(this.employee_info);
                    lbtn.CausesValidation = false;
                    lbtn.Attributes.Add("runat", "server");
                    cell.Controls.Add(lbtn);
以下是员工信息方法:

//the info will be pulled from the database…
public void employee_info(object sender, EventArgs e)
    { 
        name.Text = "employee name";
        dept.Text = "employee department";
        jobt.Text = "employee job title";
        email.Text = "employee email";
        tel.Text = "employee telephone";
        ModalPopupExtender1.Show();
    }
检查这个答案

这解释了动态控件的行为

您需要考虑:

  • 不使用母版页时,应在PreInit事件中创建动态控件,如果是,则在Init事件中创建控件
  • 避免在这些事件中设置可以在每个post中更改的属性,因为当应用视图状态(在post事件中)时,这些属性将被覆盖
  • 每次发布页面时都必须创建动态控件,如果(!this.IsPostBack)this.CreatemyDynamicControls(),请避免此操作
  • 在PreInit或Init事件中创建控件时,它们的状态将在post事件中自动设置,这意味着在LoadComplete事件中,控件将包含它们的状态,即使在每次post中再次创建控件时,甚至在没有显式设置其状态时。注意:当您处理在设计时创建的控件时,此行为是不同的,在这种情况下,设置状态的事件是加载事件
  • 事件订阅应在PageLoadComplete之前发生,否则不会引发事件订阅
编辑1 如果您没有找到解决方案,这是一种方法(完整的工作示例):

ASPX



代码隐藏
受保护的int NumberOfControl
{
得到
{
如果(ViewState[“c”]==null)
{
返回0;
}
返回int.Parse(ViewState[“c”].ToString());
}
设置
{
ViewState[“c”]=值;
}
}
受保护的void addControl\u单击(对象发送方,事件参数e)
{
这个.NumberOfControls++;
this.myPanel.Controls.Add(新文本{Text=“
”}); 添加(this.CreateLinkButton(this.NumberOfControls)); } 受保护的无效页面\u预加载(对象发送方,事件参数e) { this.createDynamicClinkButtons(); } 私有void CreateDynamicClinkButtons() { for(int i=0;i”}); this.myPanel.Controls.Add(this.CreateLinkButton(i+1)); } } 私有链接按钮CreateLinkButton(内部索引) { var l=newlinkbutton{Text=“MyLink”+index.ToString(),ID=“myLinkID”+index.ToString()}; l、 单击+=(x,y)=> { this.lblMessage.Text+=“
ID:”+(x作为链接按钮).ID; }; 返回l; }
输出

所有控件都在更新面板中吗?是的,我将表格放在aspx页面中,表格后面的代码是动态填充的……您已经能够解决它了吗?我认为您的代码是正确的,但您需要知道哪个控件是发送方。。。。您需要像这样的东西,LinkButton objButton=(LinkButton)sender;name.text=objButton.text,嗯,它仍然模糊不清^ ^ ^ ^ ^据我所知,在页面_LoadComplete中,我应该这样写:linkbtn..Click+=neweventhandler(方法_name);没有任何声明,这是正确的吗??如果是,那么我如何知道按钮ID?因为它是动态创建的。
    <asp:ScriptManager runat="server" />
    <asp:UpdatePanel ID="UpdatePanel1" runat="server" ViewStateMode="Enabled">
        <ContentTemplate>
            <asp:Panel runat="server" ID="myPanel">
            </asp:Panel><br />
            <asp:Button ID="Button1" Text="add control" runat="server" OnClick="addControl_Click" /><br />
            <asp:Label ID="lblMessage" runat="server" />
        </ContentTemplate>
    </asp:UpdatePanel>
    protected int NumberOfControls
    {
        get
        {
            if (ViewState["c"] == null)
            {
                return 0;
            }

            return int.Parse(ViewState["c"].ToString());
        }
        set
        {
            ViewState["c"] = value;
        }
    }

    protected void addControl_Click(object sender, EventArgs e)
    {
        this.NumberOfControls++;
        this.myPanel.Controls.Add(new Literal { Text = "<br />" });
        this.myPanel.Controls.Add(this.CreateLinkButton(this.NumberOfControls));
    }

    protected void Page_PreLoad(object sender, EventArgs e)
    {
        this.CreateDynamicLinkButtons();
    }

    private void CreateDynamicLinkButtons()
    {
        for (int i = 0; i < this.NumberOfControls; i++)
        {
            this.myPanel.Controls.Add(new Literal { Text = "<br />" });
            this.myPanel.Controls.Add(this.CreateLinkButton(i + 1));
        }
    }

    private LinkButton CreateLinkButton(int index)
    {
        var l = new LinkButton { Text = "MyLink" + index.ToString(), ID = "myLinkID" + index.ToString() };
        l.Click += (x, y) =>
        {
            this.lblMessage.Text += "<br/>ID: " + (x as LinkButton).ID;
        };

        return l;
    }