【问题标题】:Events that arent triggered by their buttons不是由其按钮触发的事件
【发布时间】:2011-09-15 14:36:18
【问题描述】:

我生成了两个按钮并将它们放入按钮列表中..

       List<Button> buttons = new List<Button>();
       Button pgs=new Button
            for(int i=0;i<2;i++)
                        pgs.Width = 20;
                        pgs.Command += obtainTopicsPerPage_Click;
                        pgs.CommandName = i.ToString();
                        pgs.Text =i.ToString();

                        btns.Add(tPage.ToString());
                        buttons.Add(pgs);

我将按钮添加到占位符,它们出现在页面上。

他们的事件如下:

   void obtainTopicsPerPage_Click(Object sender, CommandEventArgs e)
    {
        foreach (var item in tPages)
        {
            if (item.Key == e.CommandName)
            {
                foreach (var posts in item.Value)
                {
                    posts.ExecuteAll();
                }
            }
        }
         MyButtonTable();
    }

函数的作用无关紧要(它们只是创建表格并使其看起来像论坛页面中的帖子)..

现在,当用户单击屏幕上出现的任何一个按钮时..没有任何事件被触发..我在 eventthanlder 方法中设置了一个断点,Web 应用程序无法到达那里。

我所关心的是为什么按钮没有附加到我给它们的事件处理方法上。为什么当我在它永远不会触发的事件中设置断点时。

当点击按钮时应该发生什么......应该首先触发事件,然后应该加载页面。但这不会发生..发生的是按钮事件被跳过,并且在按钮单击后每次回发都会触发页面加载事件..

更新:

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;

public partial class Default2 : System.Web.UI.Page
{
    string[] d;
    protected void Page_Load(object sender, EventArgs e)
    {
         d = new string[] { "dfadfas", "daads", "dasda", "dads" };
        Buttons();
    }
    List<Button> btns;
    public void Buttons()
    {
        btns = new List<Button>();
        for (int i = 0; i < 20; i++)
        {
            Button d = new Button();
            d.Text = "Click me";
            d.Click += Me_Click;
            btns.Add(d);

        }
       function();

    }
    public void function()
    {
        foreach (var item in btns)
        {
            PlaceHolder1.Controls.Add(item);
        }

    }
    public int i { get{object o=ViewState["i"];return (o==null)?0:(int)o;} set{ViewState["i"]=value;} }
    public void Me_Click(object sender, EventArgs e)
    {

        foreach (var item in d)
        {
            Label da= new Label();
            da.Text = "d"+i+++"<br/>";
            this.Controls.Add(da);

        }


    }
}

上面的工作代码..

我通过使用 Session 保存按钮列表进行了测试。在这里,我在 PreInit 处重新创建按钮

 void Page_PreInit(object sender, EventArgs e)
{
    List<Button> btn = (List<Button>)Session["Buttons"];//debugging shows 2 buttons
    if (btn != null)
    {
        foreach (var item in btn)
        {
            item.Width = 20;
            item.Command += obtainTopicsPerPage_Click;
            item.CommandName = tPage.ToString();
            item.Text = tPage.ToString();
        }
    }

【问题讨论】:

  • 您的第一个代码块似乎无效 - 请检查并更正。
  • 它有效。我发布了一些...所有按钮都是有效的。和列表
  • 您的代码可能在您的项目中有效,但请看一下 - 您在此处发布的内容无效。对于初学者,您的 for 循环没有大括号。
  • 您提到使用 Click 时会丢失一些数据。这让我想知道你是否有两个问题。首先,对页面事件及其发生的顺序感到困惑,其次让您的自定义事件起作用。我们的 'Evil Greebo' 朋友是对的,更多的代码会帮助我们。
  • 顺便说一句 - 请停止使用像“d”这样的变量名。您已经在两个地方定义了 d - 一次在页面级别,一次在您的按钮创建中 - 当您这样做时,代码变得非常难以遵循。让您的变量名称提供信息 - 告诉我们它们打算如何使用它们的名称。

标签: c# asp.net events


【解决方案1】:

您确定您使用的是正确的事件吗?你不应该使用Button.Click 吗?

【讨论】:

  • 命令应该可以工作,但他没有正确添加处理程序。
【解决方案2】:

这个pgs.Command += obtainTopicsPerPage_Click;应该是pgs.Command += new CommandEventHandler(obtainTopicsPerPage_Click);

您没有正确添加命令处理程序new CommandEventHandler(obtainTopicsPerPage_Click);

编辑:由于您要添加动态控件,因此在页面加载时,您的代码应再次执行以触发事件。

【讨论】:

  • 不,命令只要进入命令事件处理程序就应该可以工作。
  • 但是如果我使用点击,我会丢失所有与按钮相关的信息......例如它们的文本/数字值
  • 在 .NET 4.0 中,语法 Object.Event += HandlerEvent();有效,多余的“new Handler(instance);”不再需要格式。
  • 我刚刚更新了我的答案。尝试获得最新的答案并检查,它将 100% 工作。
  • 您是否在页面加载时添加这些按钮?
【解决方案3】:

使用Command没有什么问题。

在新页面上尝试此操作作为起点,您应该会看到 Button1_Command 事件引发预期的异常。我当然会:)

    protected void Page_Load(object sender, EventArgs e)
    {
        Button pgs = new Button();
        pgs.Command += Button1_Command;
        Controls.Add(pgs);
    }

    void Button1_Command(object sender, CommandEventArgs e)
    {
        throw new NotImplementedException();
    }

我怀疑您的代码中的其他地方存在我们没有看到的问题。请向我们展示更多与按住按钮等相关的代码。

顺便说一句,是的,它确实可以编译并运行(尽管我忘记了 form1 参考;))

【讨论】:

  • 它甚至不会编译!!。我刚刚测试过。
  • 您使用的是什么版本的 ASP.NET?它在 VS2010/.NET 4 中为我完美编译和运行
  • 它确实可以编译,我测试了它.....但是为什么我的代码不起作用..它不会触发事件..为什么
  • 我不确定 - 我已经尝试过你的代码并且它正在工作 - 行为很时髦,但事件正在触发。
  • 尝试停止您的本地 Web 服务器并清理您的解决方案文件(构建 -> 清洁解决方案) - 我想知道是否存在一些缓存问题...
【解决方案4】:

这对我有用,希望能给你一个想法。我知道这非常简单,但从您提供的内容开始。当您单击按钮时,页面会重新加载,因此会重新创建按钮并重新设置所有内容。为避免这种情况发生,请检查 Page.IsPostBack 是否为假。

public partial class GuessNumber : System.Web.UI.Page {
    protected void Page_Load(object sender, EventArgs e) {
        lblResult.Text += "Written in by Page_Load <br />";
    }


    protected void LoveMyButtons_click(object sender, EventArgs e) {
        string response = txtGuess.Text;

        lblResult.Text += string.Format("LoveMybuttons " + response + " <br />");
    }

    protected void Page_PreInit(object sender, EventArgs e) {
        CreateButtons();
    }


    List<Button> btns;
    public void CreateButtons() {

        btns = new List<Button>();

        for (int i = 0; i < 6; i++) {
            Button butt = new Button();
            butt.Text = "Click me";
            butt.Click += LoveMyButtons_click;
            btns.Add(butt);

        }
        AddMyButtonsToAPlaceHolder();
    }

    public void AddMyButtonsToAPlaceHolder() {
        foreach (var item in btns) {
            plhButtonStore.Controls.Add(item);
        }

    }

}




<body>
<form id="form1" runat="server">
<div>
    <asp:TextBox ID="txtGuess" runat="server" />
    <asp:Button ID="btnPeanut" runat="server" Text="Guess" />

    <br /><br />
    <asp:Label ID="lblNumberOfGuesses" runat="server" />
    <br />
    <asp:Label ID="lblResult" runat="server" />
    <br />
    <asp:PlaceHolder ID="plhButtonStore" runat="server" />
</div>
</form>
</body>

【讨论】:

  • 我知道错误是什么。该按钮在其事件处理程序之前触发 page_Load 事件..单击或命令或其他任何内容..我对吗?
  • Page_PreInit 首先运行,但是当它调用 CreateButtons 时,它会在每次刷新页面时运行,单击按钮也是如此。
  • 按钮无法触发自己的事件处理程序。事件处理程序响应一个事件,无论是有人点击按钮,还是模仿这个事件,例如 jQuery 或一些 javascript 函数。
【解决方案5】:

您在哪里创建按钮?应该是走错地方了。见这里:http://msdn.microsoft.com/en-us/library/ms178472.aspx

按照文档的建议在PreInit 中尝试。

【讨论】:

  • 问题是创建按钮的逻辑取决于页面加载事件中的逻辑。所以我不可能将按钮放在 prepage_init 事件中。我试图也这样做..将列表放入会话并将其取出。我跟着它调试..还是不行
  • 正在创建的按钮可能在一个请求的Page_Load 中决定,但该按钮应该在下一个请求的PreInit 中重新创建。也就是说,如果您正在处理回发,则应在PreInit 中(重新)创建控件。
【解决方案6】:

根据其他海报所说的内容。

您可以尝试以下方法:

pgs.Click += obtainTopicsPerPage_Click;

并确保设置代码位于 PreInit 或 PreRender 事件中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 2012-08-18
    • 1970-01-01
    • 1970-01-01
    • 2012-01-19
    • 2022-01-06
    相关资源
    最近更新 更多