【问题标题】:Winforms c# - Set all booleans to false?Winforms c# - 将所有布尔值设置为false?
【发布时间】:2016-06-24 16:08:13
【问题描述】:

我在表单中声明了一些由按键触发的布尔值。本质上,我希望它在触发 if 语句时,我的表单中的所有布尔变量都为 false。我在 if 语句中有以下内容;

//Spike contact
        if (pbPlayer.Right > pbSpike1.Left && pbPlayer.Right < pbSpike1.Right && pbPlayer.Bottom > pbSpike1.Top || pbPlayer.Left < pbSpike1.Right && pbPlayer.Left > pbSpike1.Left && pbPlayer.Bottom > pbSpike1.Top)
        {
            timer1.Stop();
            MessageBox.Show("Gameover!");
            pbPlayer.Location = ReSpawn;
            timer1.Start();
            foreach (bool Movement in this.Controls)
            {
                Movement = false;
            }
        }

当我尝试将移动设置为 false 时,它​​说它是不可分配的,因为它是一个 foreach 迭代。

【问题讨论】:

  • 我的表单中的所有布尔值是什么意思?您是指所有CheckBox 控件吗?还是所有布尔成员变量?
  • 它们被声明为布尔变量
  • 嗯,这很荒谬。将它们移动到另一个小类中,创建它的一个新实例。

标签: c# winforms boolean


【解决方案1】:

我认为最好明确地为您的成员变量赋值,并避免使用这种容易出错的自动逻辑。

作为一个选项,您可以使用反射来找到它们,然后设置它们的值。
添加using System.Reflection;,然后使用下面的代码,您可以找到所有非公共布尔成员字段并将它们设置为false

this.GetType().GetFields(BindingFlags.NonPublic | 
                         BindingFlags.Instance |
                         BindingFlags.DeclaredOnly)
    .Where(x => x.FieldType == typeof(bool))
    .ToList()
    .ForEach(f =>
    {
        f.SetValue(this, false);
    });

【讨论】:

  • 这是否在 if 语句中,因为在此上下文中未识别 BindFlags。
  • 别忘了加using System.Reflection;
  • 看起来它做到了。我的运动布尔不再自行继续,感谢您的帮助!
【解决方案2】:

我明白你在做什么,但你在滥用foreachforeach 语句适用于数组和集合。表示集合元素的变量必须具有与集合的每个元素匹配的类型。您不能使用 foreach 过滤集合中与您指定的类型匹配的属性。

this.Controls 中的东西必须都是从System.Windows.Forms.Control 派生的。复选框可以在该集合中,但 bool 类型的变量不能,因为布尔值(准确地说是 System.Boolean)不是从 System.Windows.Forms.Control 派生的。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 2018-10-19
    相关资源
    最近更新 更多