2016-03-10 51 views
0

我有幾個布爾值聲明在我的形式由按鍵觸發。實質上,我希望如此,當if語句被觸發時,我的表單中的所有布爾變量都是假的。我在if語句中有以下內容;Winforms c# - 將所有布爾值設置爲false?

//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迭代。

+0

你的意思是*我的表單*中的所有布爾值是什麼意思?你的意思是所有的CheckBox控件?或所有布爾成員變量? –

+0

它們被聲明爲布爾變量 –

+1

嗯,這是相當荒謬的。將他們移到另一個小班,創建一個新的實例。 –

回答

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); 
    }); 
+0

這是否在if語句中,因爲在此上下文中未標識BindFlags。 –

+1

不要忘記添加'使用System.Reflection;' –

+0

看起來像它這樣做。我的運動布爾不再繼續自己,感謝您的幫助! –

0

我看到你想要做什麼,但你濫用foreachforeach聲明適用於數組和集合。表示集合元素的變量必須具有與集合中每個元素相匹配的類型。您不能使用foreach來篩選集合中與您指定的類型匹配的屬性。

this.Controls中的東西都必須來自System.Windows.Forms.Control。複選框可以在該集合中,但bool類型的變量不能,因爲bool(準確地說,System.Boolean)不是從System.Windows.Forms.Control派生的。

相關問題