将click事件处理程序添加到在另一个类中动态创建的按钮

时间:2018-09-23 04:50:23

标签: c# asp.net webforms

我有一个确认按钮正在与要与按钮进行交互的aspx页面后面的代码不同的类中创建。

基本上,说我有这个确认类:

public class Confirmation
{
    public void GenerateButtons()
    {
        Button btnConfirm = new Button();

        btnConfirm.Text = "Confirm";
        btnConfirm.CommandName = "Variable1,Variable2,Variable3";

        _Default def = new _Default();
        btnConfirm.Click += new EventHandler(def.btnConfirmBook_Click);
    }
}

上面的代码是该代码的非常解释版本。但是,会在循环中生成多个按钮并将其添加到表中。该表显示在下面提到的Default.aspx页上。对于表中的每一行,CommandName属性的值包含不同的值。

我正在使用的aspx页面是Web Forms .NET Web App中的“默认”页面。

我希望单击这些按钮之一时触发事件,以将其带回到Default.aspx页面(Default.aspx.cs)后面的代码中。

这就是Default.aspx.cs中的内容:

public void btnConfirm_Click(object sender, EventArgs e)
{
    Button btn = sender as Button;

    DisplayConfirmation(btn.CommandName);
}

protected void DisplayConfirmation(string result)
{
    // I split result and manipulate it as necessary to get a confirmationText string

    pnlMainPanel.Visible = false; // This is where it throws NullReferenceException
    pnlConfirmationPanel.Visible = true;

    lblConfirmationText.Text = confirmationText;
}

我假定尝试更改面板的可见性时会抛出NullReferenceException,因为我创建了_Default类的新实例,以便可以在第一个代码段的最后一行中设置EventHandler。

但是我不知道如何使它工作。

1 个答案:

答案 0 :(得分:1)

您假设正确。不要创建_Default类的新实例。

ASPX:

<form id="form1" runat="server">
<div>
    <asp:Panel ID="Panel1" runat="server">
        make me invisible;
    </asp:Panel>
</div>
</form>

隐藏代码:

protected void Page_Load(object sender, EventArgs e)
{
    GenerateButtons();
}

public void GenerateButtons()
{
    AnotherClass anotherClass = new AnotherClass(this);
}

public void btnConfirmBook_Click(object sender, EventArgs e)
{
    Button btn = sender as Button;
    DisplayConfirmation();
}

protected void DisplayConfirmation()
{
    Panel1.Visible = false;
}

另一个班级:

public class AnotherClass
{
    public AnotherClass(Default def)
    {

        Button btnConfirm = new Button();

        btnConfirm.Text = "Confirm";
        btnConfirm.CommandName = "Variable1,Variable2,Variable3";
        def.Form.Controls.Add(btnConfirm);

        btnConfirm.Click += new EventHandler(def.btnConfirmBook_Click);

    }
}