【问题标题】:C# Checkbox has strange behaviorC# Checkbox 有奇怪的行为
【发布时间】:2012-01-31 18:39:43
【问题描述】:

第一次显示 winform 时,默认情况下未选中该复选框。如果当表单第一次显示时,我单击复选框以“选中”它,复选框会在一瞬间出现选中,然后消失。 checkedchanged 事件永远不会触发。但是,如果在第一次初始尝试后的任何时候我单击复选框,则值会更改(选中为未选中,反之亦然),并且事件会触发。

知道为什么复选框不会在第一次尝试时检查吗?当您将鼠标悬停在它上面时,它第一次显示为选中状态,所以我知道它有焦点。

更新:如果您先将数据输入所有其他控件然后单击复选框,则无关紧要,第一次单击它时,它会闪烁一秒钟,然后检查消失。第一次之后的任何时候,虽然它有效。奇怪……

【问题讨论】:

  • 发布一些代码,例如复选框初始化和事件处理...您是否使用任何绑定?
  • 您能否发布处理任何复选框事件(单击、CheckChanged 等)的方法的代码
  • 您在这里发帖时需要提供更多信息。请不要浪费别人的时间
  • 我在您发表评论之前发布了代码。见下文。

标签: c# winforms checkbox


【解决方案1】:

如果没有看到代码 sn-p,很难说。当我过去遇到这样的事情时,这是由于有重复的控件 ID,或者错误地连接了事件处理程序。您是否尝试过禁用部分代码并查看影响复选框行为的因素?

【讨论】:

  • +1 指出他需要减少他的问题问题空间。 但是,您对控件 ID 的评论带有 C++/Win32 背景的味道。如果在 C# 中有重复的控件 ID,我会感到惊讶......另一方面,连接不良的事件处理程序是我投入资金的地方......(我刚刚编写了一个示例应用程序,它只有一个复选框表单...当我第一次点击它时它一直被点击...)
【解决方案2】:

奇怪的是,将代码放入 CheckedChanged() 以设置值(如果我跟踪它,它会被设置为什么)似乎有效:

        if (this.chkbox1.Checked == true)
        {
            this.chkbox1.Value = "1";
            this.chkbox1.Text = "Checked";
        }
        else
        {
            this.chkbox1.Value = "0";
            this.chkbox1.Text = "Un-checked";
        }

我还在click()中放了一个focus():

        if (((System.Windows.Forms.MouseEventArgs)(e)).Clicks <= 1)
        {
            if (this.chkbox1.Focused == false)
            {
                this.chkbox1.Focus();
            }
        }

我不知道为什么这样可以解决问题,但确实可以。

【讨论】:

    【解决方案3】:

    只有一个 CB 会发生这种情况吗?或表格上的所有 CB。

    您是否尝试过删除 CB 然后将其添加回来?

    我建议你把代码贴在 CB 后面?

    【讨论】:

    • 感谢您响应 Crash 和 flyfishr,我删除了控件并在表单上放置了一个新的锥体,没有自定义代码作为测试,我没有得到相同的行为。很难看出是否有任何原因导致了这种情况。当我删除所有自定义代码时,它仍然会发生。我尝试在构造函数中设置焦点并将控件设置为checkedstate = checked(这与我在表单加载时想要的默认行为相反)但第一次单击确实将其设置为未选中。如果我设置 focus() 然后将状态设置为未选中,它会完成整个闪烁和消失的事情。
    • 我还将以下代码放入表单构造函数中作为测试,但它不会改变行为:this.chkbox1.UnCheckedValue = "0"; this.chkbox1.CheckedValue = "1"; this.chkbox1.ThreeState = false; this.chkbox1.Value = "0"; this.chkbox1.Checked = false;如果我在第一次单击控件时中断单击,它会进入单击状态,但不会触发 CheckChanged()。但它会在随后的点击中发生。
    【解决方案4】:

    对于您的自定义代码,我会尝试使用不同的演员表风格,看看是否有什么不同。

    如果您使用标准 C# 语法,但它会失败(复选框消失)

    CheckBox checkBox = sender as CheckBox;
    

    我会尝试在 sender 对象上使用旧式强制转换,看看它是否会给你想要的结果:

    CheckBox checkBox = (CheckBox)sender;
    

    这可能会给你一个关于根本原因的提示。

    【讨论】:

      猜你喜欢
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-07-18
      • 2018-01-03
      • 2019-04-10
      • 2019-05-24
      相关资源
      最近更新 更多