【问题标题】:C# - Event handler for dynamic buttonsC# - 动态按钮的事件处理程序
【发布时间】:2012-08-17 15:22:30
【问题描述】:

我有一个使用设计模式创建的文本框和提交按钮。

按下提交按钮时,它将从文本框中检索用户输入,然后对我的数据库进行查询。 然后它将根据从我的数据库中检索到的信息显示动态按钮列表。

但是,按钮的事件处理程序在单击时不会触发。我想我的问题是回发,但 我无法在 page_load 等中创建这些按钮,因为我需要先获取用户输入(按下提交按钮时从文本框中),然后才能加载按钮。

我该如何解决这个问题?

谢谢。

编辑(代码):

protected void subBtn_Click(object sender, EventArgs e)
{
       //database setup codes
        .......


       while (reader.Read())
       {
            Button detailsBtn = new Button();
            detailsBtn.Text = reader["fName"].ToString();
            //doesn't fire
            detailsBtn.Click += new EventHandler(detailsBtn_Click);
            memPanel.Controls.Add(detailsBtn);
       }
}

【问题讨论】:

  • 向我们展示按钮是如何创建的。将它们全部连接到单个事件处理程序应该很容易实现。
  • 如果你需要像这样对用户的决定做出反应,考虑使用 ajax 来提供你想要的功能是值得的。它可以提高您应用的性能,而您不必解决此类问题。
  • 嗨,用代码编辑了我的问题。谢谢

标签: asp.net button event-handling webforms postback


【解决方案1】:

主要问题是如果这些控件不存在,则 Postback 会在每个 postback 上重新生成动态控件。 如需快速演示,请参阅此代码

ASPX 代码

<form id="form1" runat="server">
<asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" />
<asp:Panel ID="pnl" runat="server"></asp:Panel>
</form>

ASPX.CS 代码

protected void Page_Load(object sender, EventArgs e)
        {
            if(IsPostBack)
            {
                generate();                
            }
        }
        public void generate()
        {
            if (!pnl.HasControls())
            {
                for (int i = 0; i < 4; i++)
                {
                    Button detailsBtn = new Button();
                    detailsBtn.Text = "fName" + i.ToString();
                    detailsBtn.ID = i.ToString();
                    detailsBtn.Click += new EventHandler(detailsBtn_Click);
                    pnl.Controls.Add(detailsBtn);
                }
            }
        }
        protected void Button1_Click(object sender, EventArgs e)
        {
            generate();
        }

        protected void detailsBtn_Click(object sender, EventArgs e)
        {
        }

【讨论】:

  • 感谢您的回复。但是我有其他按钮具有其他功能,如果我将 generate() 放在 ispostback 中,它不会在每次页面回发时调用该方法。
【解决方案2】:

在我看来,您可以轻松地重构页面以使用简单的&lt;asp:Repeater runat="server" ..&gt;&lt;/asp:Repeater&gt;,而不是向面板动态添加控件。

这是一个非常简单的完整示例:

RepeaterTest.aspx

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="Server">
    <asp:TextBox ID="theTextBox" runat="server"></asp:TextBox>
    <asp:Button ID="theButton" runat="server" OnClick="theButton_Click" Text="Click me" />
    <asp:Repeater ID="test" runat="server">
        <ItemTemplate>
            <asp:Button ID="theRepeaterButton" runat="server" Text='<%# Eval("fName") %>' OnClick="theRepeaterButton_Click" />
        </ItemTemplate>
    </asp:Repeater>
</asp:Content>

RepeaterTest.aspx.cs

public partial class RepeaterTest : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }
    protected void theButton_Click(object sender, EventArgs e)
    {
        string filter = theTextBox.Text;
        // below row simulates fetching data using the filter text in the text box
        var data = Enumerable.Range(0, 20).Select(i => new { fName = filter + " " + i });
        test.DataSource = data;
        test.DataBind();
    }
    protected void theRepeaterButton_Click(object sender, EventArgs e)
    {
        var button = (Button)sender;

        // do something here based on text/commandname/commandargument etc of the button

    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-03
    • 2017-07-29
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    相关资源
    最近更新 更多