动态创建的LinkBut​​tons的OnClick事件不起作用

时间:2012-06-23 07:31:35

标签: asp.net ajax onclick modalpopupextender linkbutton

我已经为这个问题尝试了几种解决方案,但没有一种能够解决问题。 基本上,我有一个员工表,用户可以选择通过更新面板动态添加员工。每个员工都被添加为 LinkBut​​ton ,此按钮将通过 ajaxToolkit:modalpopupextender 窗口> OnClick 事件,此窗口将显示员工详细信息。 问题是,当我点击员工姓名时,弹出窗口将显示详细信息。

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

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

这是employee_info方法:

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

1 个答案:

答案 0 :(得分:2)

检查此答案

https://stackoverflow.com/a/11127064/1268570

这解释了动态控件的行为

你需要考虑:

  • 当您不使用母版页时,应在PreInit事件中创建动态控件,如果是,则在Init事件中创建控件
  • 避免设置可在这些事件中的每个帖子中更改的属性,因为应用视图状态(在事件后)中将覆盖属性
  • 每次发布​​页面时都必须创建动态控件,如果(!this.IsPostBack)this.CreatemyDynamicControls();
  • ,请避免这种情况。
  • 当您在PreInit或Init事件中创建控件时,它们的状态将自动设置在post事件中,这意味着在LoadComplete事件中,即使您在每个帖子中再次创建它们,控件也会包含其状态。当你没有明确设置他们的状态。 注意当您处理在设计时创建的控件时,此行为是不同的,在这种情况下,已设置状态的事件是Load事件
  • 事件订阅应在PageLoadComplete之前发生,否则不会被引发

编辑1

如果您没有找到解决方案,这是一种方法(完整的工作示例):

ASPX

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

输出

enter image description here