Skip to content

Instantly share code, notes, and snippets.

@akira345
Last active December 14, 2015 13:58
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save akira345/5096951 to your computer and use it in GitHub Desktop.
Save akira345/5096951 to your computer and use it in GitHub Desktop.
VB.Netでパネル上に配置されたテキストボックスのNullチェック
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim Requisite() As String = {"Txt_name", "Txt_jyusyo", "Txt_tel"}
'
'カレントコントロールから
'OfTypeでまずはパネルコントロールをフィルタ
'これをfromとし、
'さらにテキストボックスをフィルタ Function(c)
'これに対し、Function(c1)で、配列Requisiteに入っている要素から、TextがNullのものを選択 Function(cc)
'
'Dim count = Me.Controls.Cast(Of Control)().OfType(Of Panel).Count(Function(c) c.Controls.Cast(Of Control).OfType(Of TextBox).Where(Function(c1) Requisite.Contains(c1.Name)).Any(Function(cc) cc.Text = ""))
Dim count = _
Me.Controls.Cast(Of Control)(). _
OfType(Of Panel). _
Count( _
Function(c) c.Controls.Cast(Of Control). _
OfType(Of TextBox). _
Where(Function(c1) Requisite.Contains(c1.Name)). _
Any(Function(cc) cc.Text = "") _
)
If count > 0 Then
MessageBox.Show("エラー")
End If
End Sub
End Class
@akira345
Copy link
Author

akira345 commented Mar 6, 2013

上記コードをLINQに書き換えたい。
ついでに、チェックするテキストボックスをRequisite配列にセットした名前のテキストボックスに絞りたい。

@kiyokura
Copy link

kiyokura commented Mar 6, 2013

若干アプローチが変わりますが、こんなのどうでしょう?

    Dim Requisite() As String = {"Txt_name", "Txt_jyusyo", "Txt_tel"}
    Dim count = Me.Controls.Cast(Of Control)().OfType(Of Panel).
            Count(Function(c) c.Controls.Cast(Of Control).
                      OfType(Of TextBox).
                      Where(Function(c1) Requisite.Contains(c1.Name)).
                      Any(Function(cc) cc.Text = ""))

    If count > 0 Then
        MessageBox.Show("エラー")
    End If

@akira345
Copy link
Author

akira345 commented Mar 6, 2013

おお!ありがとうございます。
何やっているのか解析してみます。

@kiyokura
Copy link

kiyokura commented Mar 6, 2013

OfTypeというのはさっきすっかり失念していたのですが、TypeOf で簡易に絞り込むメソッドです。

実は私も最初、先にパネルのコレクションを抽出して、その中のControlsの中を調べる…というアプローチを試みたのですが、それだと文を二つに分けたほうがわかりやすい感じになりつつ、一回、For Eachが登場しそうな雰囲気になりました。
#それでもできるんじゃないかと思うのですが、私のLINQ力ではパッと思いつきませんでした。

で、改めでアプローチを変えて、最終的に「条件に合致するTextBoxを含むPanelの数」を返すアプローチにしてみました。

…バグがあったら済みません(ぉ

@akira345
Copy link
Author

akira345 commented Mar 6, 2013

なるほど。結果としてはT/Fしかないので、条件に合致するパネルの数でも確かに問題ないですね。
(この発想転換が中々出来ない)
OfTypeメソッド、知りませんでした。これだけでいつくかのループが削除できそうです。
勉強に成りました。
(未入力項目が3つなのにcountの値が1なのでバグかと思ったのは内緒だw)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment