配置されたCheckBoxを全てFalseに設定したいです。
For Each LopCntrol As Control In Me.Controls
If TypeOf LopCntrol Is CheckBox Then
LopCntrol.Enabled = False
End If
Next
としていたのですが、折角なのでLINQでやろうと
Me.Controls.Cast(Of Control).Where(Function(n) TryCast(n, CheckBox) IsNot Nothing).Select(Function(s) s.Enabled = False)
に変更したところ上手く動きません。
Dim Chkbox = Me.Controls.Cast(Of Control).Where(Function(n) TryCast(n, CheckBox) IsNot Nothing)
For Each Lop In Chkbox
Lop.Enabled = False
Next
なら、上手く動きます。
1行で実現する(ForEachを使わないで)方法が分かりません。
詳しい方いらっしゃいましたら、ご教授頂けないでしょうか?
宜しくお願い致します。
なので、はっきり言ってしまえばFor Eachしてください。 ただしTypeOf...Isなどの代わりにOfType拡張メソッドは使用できます。 IEnumerableのうち、Of Tで指定したオブジェクトだけを列挙する拡張メソッドです。 For Each (Dim cb In Me.Controls.OfType(Of CheckBox)()) ' cbは必ずCheckBoxであり、CheckBox以外のコントロールは列挙されない
Friend Module ControlExtensions <System.Runtime.CompilerServices.Extension> Public Function GetControls(Of T As Control)(this As Control) As IEnumerable(Of T) Dim controls = this.Controls.OfType(Of Control)() Return controls.OfType(Of T)().Concat(controls.SelectMany(Of T)(AddressOf GetControls(Of T))) End Function End Module
Hongliang様、魔界の仮面弁士様
早速のご指南有難う御座います。
魔界の仮面弁士様のおっしゃる通り
For Each chk In Me.Controls.OfType(Of CheckBox)()
chk.Enabled = False
Next
で、やるのが近い将来自分のコードを見た時に
なにやってるんだ?ってことにならず、ベストだと思いました。
いつも、適切なご指導大変助かっております。
有難う御座いました。