动态添加按钮到面板,单击不会触发

时间:2015-02-24 16:02:05

标签: asp.net

我觉得我面临着一个愚蠢的问题而且我在某个地方错过了一件小事,但我真的不明白:/

我有一个包含面板的向导步骤。 我动态添加到此面板按钮,并为这些按钮的click事件分配一个事件处理程序。

点击事件处理程序中的代码不会起作用,它有点让我感到沮丧,因为它看似简单而愚蠢,但仍然无法工作并且花费了太多时间。

如果你们其中一个人会看一看并且看看我没看到的东西,那会很棒。

PS:我对ASP .NET并不熟悉

这里是代码的一部分:

向导步骤:

<asp:WizardStep ID="step1" runat="server" StepType="Complete" OnActivate="step1_Activate">
            <asp:Panel ID="panelID" runat="server" ScrollBars="Both" />
            <asp:Button ID="btnBack" runat="server" CssClass="bigButton" Text="<%$Resources: WebResources, CommonButtonBackText %>" OnClick="btnBack_Click" />
        </asp:WizardStep>

这是step1_Activate背后的代码:

try
        {
            panelID.Controls.Clear();

            // Get list of asset dto for current user
            var userId = long.Parse(Session["ID"].ToString());

            var userDtos = presenter.DoSomething(userId );

            // Create buttons container

            foreach (var button in userDtos.Select(dtoProperty => new Button() { Text = dtoProperty.ToString(CultureInfo.InvariantCulture) }))
            {

                button.Click += new EventHandler(button_Click);

                button.Click += delegate
                {
                    bossWiz.MoveTo(step2);
                };

                panelID.Controls.Add(button);
            }
        }
        catch (Exception ex)
        {
            Log.Error(ex.Message);
            bossWiz.MoveTo(stepError);
        }

点击内部的调试器永远不会触发! 该视图刚刚在向导步骤1中刷新。

有人可以告诉我,我做错了吗?

2 个答案:

答案 0 :(得分:1)

必须在每次回发时重新创建动态控件,this Article是关于如何保持动态控件及其状态的良好链接。

当您意识到Page只是一个类的实例并且为每个请求创建了一个新实例时,您会发现在执行回发时您的动态控件将不存在,并且您需要重新创建它们。 / p>

您应该将重新创建控件所需的状态存储到viewstate中,然后在每次回发时基于此CreateChildControls内部构建控件。

答案 1 :(得分:0)

  1. 确保在每个回发上重新创建动态按钮
  2. 确保为每个按钮分配不同的ID(例如btn0,btn1,btn2,...)