【问题标题】:Must click a button twice to fire an event必须单击按钮两次才能触发事件
【发布时间】:2015-04-30 16:47:39
【问题描述】:

我有一个动态创建的数据网格,用于显示从数据库中检索到的信息。数据网格由多个绑定列和每行的两个按钮列、一个视图和一个删除按钮组成。

单击任一按钮调用 Page_Load() 方法,Page.IsPostBack 为 false。

    if (!Page.IsPostBack)
    {           
        this.bindForm(); // Populates drop down lists that the user can select     
        setAccess(false); // Sets access for the page 

        // Stuff commented out to avoid confusion                   
    }
    else
    {
        bindDynamicGrids(); // Create the data grid(s) and populate them           
    }   

所以当我第一次点击按钮时,上面的代码被调用,IsPostBack 为 false,动态网格被绑定。但是,按钮单击事件不会触发。当我第二次单击该按钮时,Page_Load 会调用 IsPostBack false,并在执行 bindDynamicGrids() 后触发按钮单击事件。我无法理解第一次和第二次点击之间的区别。

我已经阅读了一些主题;

ASP.NET C#, need to press a button twice to make something happen

http://forums.asp.net/t/1783694.aspx?ASP+NET+Button+needs+to+be+clicked+twice

试图理解这个问题,但我必须遗漏一些东西。从我从第二个链接收集的内容来看,可能会在点击事件中设置会话变量,该事件也在 Page_Load 中设置,这都是排序的问题。如果是这种情况,我看不到它发生在哪里。

如果不是回发,则调用 bindForm() 方法,该方法会填充所有下拉列表。编辑点击事件使用行中的值填充这些下拉列表,但点击事件始终是回发并且表单已经被绑定。

我还考虑过让脚本在用户单击时自动双击其中一个按钮,但我无法找到列按钮的“OnClick”属性。可以提供的任何帮助都将是惊人的。

【问题讨论】:

  • 请贴出bindForm()bindDynamicGrids()两种方法的代码。
  • 我相信任何动态或动态创建的控件都不会立即注册事件,您必须订阅它们吗?我记得不久前做过类似的事情,asp.net webforms 中的动态控件会导致问题。
  • 改为在Page_Init期间添加项目和事件。
  • @KarlAnderson 我已经添加了您要求的两段代码。
  • @Walther 因此,与其在创建网格时添加事件,不如将它们添加到 Page_init 中?如果此时尚未创建动态网格怎么办(如果 Page_init 在 Page_Load 之后,我认为这永远不会发生)。

标签: c# asp.net webforms


【解决方案1】:

问题是,按钮单击事件发生在 Page_Load 事件之后,这意味着过滤不会在第一次回发时应用。它已在第二次回发时更新,您会看到过滤。 您可以尝试将 page_load 事件的代码移动到 OnPreRender,以便在按钮单击事件之后发生重新加载。

更多信息请看这里:Button needs to be clicked twicehere

【讨论】:

  • 我仍然明白为什么会出现这个问题。在这两种情况下,事件的顺序是相同的。它调用 Page_Load 并调用 bindDynamicGrids()。因此,即使在第二次单击编辑按钮后,相同的 bindDynamicGrids() 也会再次执行,但由于某种原因,它第二次获得了单击。
  • 嘿,我在某处看到它,但我没有检查它: IsPostBack =true 假设会以某种方式影响......我真的不确定,但也许它可以提供帮助。如果是,请更新我。
猜你喜欢
  • 1970-01-01
  • 2021-11-11
  • 1970-01-01
  • 2014-08-08
  • 1970-01-01
  • 2015-07-02
  • 1970-01-01
  • 2011-07-29
  • 1970-01-01
相关资源
最近更新 更多