【问题标题】:checkchanged not firing on for checkbox asp.net对于复选框 asp.net,checkedchanged 未触发
【发布时间】:2010-06-18 18:20:37
【问题描述】:

我在 .ascx 文件上有一个复选框。这个 .ascx 文件位于一个封闭源代码的 Web 应用程序中,并且某些东西阻止了 checkchanged 事件每隔一次触发。

当我第一次加载页面并在第一次触发 checkchanged 事件时单击复选框(选中它)。如果我第二次单击它(取消选中),则不会触发 checkchanged 事件。如果我再次检查它,则触发事件,当我再次取消选中它时,它不会触发并继续如此。如果我将复选框的默认值设置为 true,当它加载时,相同的效果只会在第一次取消选中时触发,第二次选中时不会触发,依此类推。

.ascx 所在的页面的 EnableViewState 以及 .ascx 都设置为 true,我什至尝试在复选框本身上设置它。该复选框也将 AutoPostBack 设置为 true。

如果我从该应用程序中提取 .ascx 文件并将其放在测试 Web 应用程序页面上,它会按预期工作。我还最好提到该复选框位于更新面板内,但这似乎并不相关,因为如果我删除更新面板,它仍然具有相同的不利影响。

此应用程序中的什么可能会阻止 checkchanged 事件每隔一段时间触发一次?

【问题讨论】:

  • 是否有任何特殊的 javascript 正在输出阻止回发?
  • 我知道它肯定会回发两次。只是在第二次单击时,它不会触发 checkchanged 事件,以此类推。
  • 我还尝试通过使用 OnLoad 事件处理程序来检查它是否是回发以及是否只是查看复选框是否被选中,但它总是认为它是错误的。 ...知道为什么会这样吗?
  • 我遇到了同样的问题。我的 ascx 包含在中继器中。当我选择 1 个项目时,事件触发一次,2 个项目,它触发两次(每个项目一次)。当我取消选中一个项目时,它将触发另一个选中复选框的事件。我确定它与视图状态有关。你弄清楚问题了吗?我已经为这个问题添加了赏金。

标签: asp.net checkbox


【解决方案1】:

嗯,您确定没有其他 javascript 错误吗?既然您提到它在更新面板中,您是否也尝试过添加触发器?

<asp:UpdatePanel>
    <ContentTemplate>
       //Content
    </ContentTemplate>
    <Triggers> 
        <asp:AsyncPostBackTrigger ControlID="yourCheckBox"  /> 
    </Triggers>
</asp:UpdatePanel>

更新: 您是否尝试过通过代码强制自动回发属性

CheckBox checkbox = yourFormOrContainer.FindControl(yourCheckBox.ID) as CheckBox;
if(checkbox != null)
{
     checkbox.AutoPostBack = true;
}

第二次更新:根据 Microsoft: CheckBox 控件必须在发送到服务器的帖子之间保留一些值,才能使此事件正常工作。确保为此控件启用了视图状态。

如果您将值保存到数据库中,当页面/更新面板回发时,您是否撤回了它的值,我怀疑它正在获取它的旧值,所以它仍然认为它已被检查,因此不会触发。如果最初在更新面板中,您是否使用 Bind 来设置其数据值,大概是位字段?

【讨论】:

  • 我只是将复选框从选中切换到未选中,如果选中则将标签设置为“true”,如果未选中则将标签设置为“false”。我没有将任何内容保存到数据库或从数据库中获取复选框的值。此外,即使我删除了更新面板,它也会发生。
  • 如果我将此用户控件放在我需要它在其中工作的这个封闭源应用程序之外的测试应用程序中,这一切都可以正常工作。封闭源应用程序以某种方式干扰它......我认为......
【解决方案2】:

这是我的猜测:如果我想要一个以这种方式运行的复选框(无论出于何种原因),我可能会重载类,然后保留一个跟踪/切换任何更改的 int(或状态布尔值),让仅当 bool 为真/int 可被 2 整除时,事件才会冒泡。

(检查http://odetocode.com/code/94.aspx 代码并想象onclick 方法中的if 语句以了解我的意思。)

至于保留计数器/状态变量,如果它不在 Viewstate 中,它可能隐藏在 ControlState、Session 甚至应用程序缓存中。 (顺便说一句,如果您还没有列出所有这些,请尝试列出...)

再一次,这可能是幼稚的,但“未检查”事件是否是单独触发的 - 并且必须在其自己的处理程序中处理?我见过更愚蠢的事情......我想。

【讨论】:

    【解决方案3】:

    这值得检查,因为我有 similar problems

    您已确认您已检查页面上的 EnableViewState 属性和控件本身。但是,ViewState 是级联的,因此如果您的控件位于控件中,并且父控件的 EnableViewState 设置为 false,那么子控件即使启用了 ViewState,也仍然没有 ViewState。

    我有很多嵌套控件,其中一个禁用了 ViewState,这让我困扰了好几个小时。

    【讨论】:

      【解决方案4】:

      目前我们正在使用 FubuMVC 慢慢重写应用程序。我有 fubu 和 webforms 并行运行,所以我能够使用 fubu 重写这个小部分,而不是试图浪费更多时间来处理这个问题的 web 表单。

      我知道对于大多数人来说,这不是一个选择,但我就是这样解决的。

      【讨论】:

        【解决方案5】:

        设置 AutoPostBack="True" 对我有用

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-03-24
          • 2011-11-17
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多