【发布时间】: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 之后,我认为这永远不会发生)。