2016-06-16 10 views
2

私は少し見たことがあり、IF文のようなもので複数のコントロールを参照する、または複数のコントロールなどにプロパティを設定する簡単な方法を見つけることができないようです(IF exists = true !)複数のコントロールを参照する最も効率的な方法。 IE:multi-WITH

あなたが好きな「ショートカット」。

Public Sub BreakCompiler() 

    if string.IsNullOrEmpty(Textbox1.text, textbox2.text, textbox3.text) Then ..... 


    'As opposed to 
    If String.IsNullOrEmpty(PartNumTextBox.Text) Or _ 
    String.IsNullOrEmpty(PartNameTextBox.Text) Or _ 
    String.IsNullOrEmpty(PartGRNTextBox.Text) Or_ 
    String.IsNullOrEmpty(SerialNumTextBox.Text) Then 
     'Warn user 
    Else 
     'do nofin. 
    End If 

またはそれ以上風変り:最高のような不正なコードで記述されるだろう

WITH Textbox1.text, textbox2.text, textbox3.text 
    .ReadOnly = true 
END WITH 
End sub 

アイデアはbasicaly同じことを行うことを、ステートメント、または任意の場合は3を実行する必要がないようにすることです3つの異なるオブジェクトへの...など。 '、'で区切ることができる複数のイベントのハンドラに似ています。

私はループコントロール(例えば、groupbox.controlsの各コントロールのIE)に気付いていますが、それは私がここで後にしていることを達成できません。 (あなたはカップルをスキップしたかったと言っていますか?)

ちょうどidが集団の知恵をチェックすると思った。

+1

はあなたが持っているか、または複数行したくない場合は(理由はここに

は一例ですあなたの唯一のオプションは、それらをリストに入れ、そのリストをループすることです。複数のリストを持ち、必要なものをループすることができます。または、コントロールの.Tagプロパティに何かを置き、タグを特定のジョブの特定の値で更新します。 –

+0

@the_lotus 'Tag'プロパティを使うのは良い考えです。いい視点ね。 – Sastreen

答えて

1

私が知る限り、if文の制御プロパティのハンドラと似たものはありません。

あなたはそれらを別々に(またはそれらをすべて配列に追加する)必要があります。または、言及したように、別のコントロール内のサブセットを調べる必要があります。

はしかし、あなたが行うことができます一つのこと(あなただけのコントロールの特定の種類を変更したいと言う)は、このです:

For Each tb As TextBox In Me.Controls.OfType(Of TextBox) 
    'do stuff here 
Next 

別のオプションは、あなたのための変更を行いますSubを作成することで、それぞれをSubに渡します。私はこのような何かが完璧に動作し、「もっと良い方法がなければならない」と思ったときに取り組んでいた特定の例

Private Sub changeTextBox(tBox as TextBox) 
    'make changes here 
End Sub 
+0

ええ、私はレコードフォームなどのすべての入力をロックするようなものには非常に頻繁に使用します。ありがとう。 – Josh

+0

しかし、上記の@the_lotusで提案されているIf.Tag = "TheseOnes"と組み合わせると、単純な効率的な解決策になるかもしれません....... – Josh

+0

@Josh '.Tag'は、型で区切られたように単純です。 – Sastreen

0

複数の種類の異なる操作を別の操作で実行しようとすると、より簡単になる場合があります。 (ありがとう@Sastreenと@the_lotus)

Private Sub Validate_PartDetails() Handles PartNumTextBox.TextChanged, PartNameTextBox.TextChanged, PartGRNTextBox.TextChanged, SerialNumTextBox.TextChanged 

    For Each tb As TextBox In BasicDetailsCustomGroupBox.Controls.OfType(Of TextBox) 
     If tb.Tag = "notnull" Then 
      If String.IsNullOrEmpty(tb.Text) Then 
       tb.BackColor = Color.MistyRose      
      Else 
       tb.BackColor = Control.DefaultBackColor     
      End If 
     End If 
     If tb.Tag = "notnumeric" Then 
      If not(isnumeric(tb.Text)) Then 
       tb.BackColor = Color.MistyRose      
      Else 
       tb.BackColor = Control.DefaultBackColor     
      End If 
     End If 
    Next 
End Sub 

ありがとうございます。

+0

controls.oftypeを削除して、フォーム全体を行うだけです。 – Josh

1

あるタイプのオブジェクトの可変長コレクションを処理したいとします。これを行う1つの方法は、ParamArrayキーワードで装飾された引数を持つヘルパーメソッドを作成することです。

Public Shared Function AnyIsNullOrEmpty(ParamArray controls As Control()) As Boolean 
    Dim ret As Boolean 
    For i As Int32 = 0 to controls.GetUpperBound(0) 
     ret = String.IsNullOrEmpty(controls(i).Text) 
     If ret then Exit for 
    Next 
    Return ret 
End Function 

Public Shared Sub SetTBReadOnlyProperty(value As Boolean,ParamArray textboxes As TextBox()) 
    For i As Int32 = 0 to textboxes.GetUpperBound(0) 
     textboxes(i).ReadOnly=value 
    Next  
End Sub 

可能な用法:

Private Sub DemoUsage 
    If AnyIsNullOrEmpty(TextBox1,TextBox3,TextBox4) then 
     ' at least one is empty 
    Else 
     ' all have value 
    End If 

    SetTBReadOnlyProperty(True,TextBox1,TextBox3,TextBox4) 
End Sub 
+0

私はParamArrayを使ったことが一度もありませんでした。どこの人生ですか? (私はここで多くを言って使用するようです:) – Josh

1

.NETの新しいバージョンは、あなたがListオブジェクト上.ForEachのLINQの拡張機能を使用することができます。たとえば、 List(Of TextBox).ForEachを匿名メソッドで使用して、Listのコントロールを素早く繰り返し、プロパティなどを操作することができます。それはまだループですが、はるかにコンパクトな形です。どのコントロールがListにあるかを選択することができ、複数のListなどを持つことができます。ちょうど3 TextBoxのだ

Public Class Form1 
    Private _BoxList As New List(Of TextBox) 
    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
     _BoxList.ForEach(Sub(tb As TextBox) tb.Enabled = Not (tb.Text = String.Empty)) 
    End Sub 
    Private Sub Form1_Shown(sender As Object, e As EventArgs) Handles Me.Shown 
     _BoxList.Add(Me.TextBox1) 
     _BoxList.Add(Me.TextBox2) 
     _BoxList.Add(Me.TextBox3) 
    End Sub 
End Class 

とバニラフォーム上Button

enter image description here

関連する問題