2017-02-02 4 views
0

vb.net(アクセス)からvb.net + SQLServerへのアプリケーションの書き換えが始まったばかりです。異なるアクティビティのフォームコントロールから反復を統合する方法はありますか

私はフォームの自動更新と元に戻すことを可能にするために、PrevValue、Modified(Textboxと同様)、Dirty、DirtyEnabled、SQLColumnName、SQLTableNameといったカスタムコントロールを(フォーム+フォームコントロール) IsDirty、Initialising、およびIsreadyプロパティとundoメソッドを公開します。

For each Ctrl as Control in frm.Controls ' frm being a reference to the form 
    if typeOf Ctrl is MyTextBox 
     with DirectCast(Ctrl, MyTextBox) 
      ' here comes the variable code depending what needs to be done 
     end with 
    elseif TypeOf Ctrl is MyComboBox 
    ' etc.... for MyListBox, MyCheckBox etc.... 

私もカスタムの数はMyTextBoxをからではなく、いくつかの修正動作を継承するMyNumBoxとMyDateBoxを制御しています

は、私が別の場所で3回同じ繰り返しのコードを記述する必要があることに発生しそう(数式の評価、日付の操作、カレンダー...)どのように私はそれらの余分なテストを行うことを避けるのですか?

この反復の1つのバージョンは、修正されたコントロールがSQLParameterとして追加され、反復処理後にSQLProcessClass UpdateまたはInsertを呼び出したSQLProcessClassにありますが、SQLアクティビティが成功した後に再びコントロールを繰り返して、各コントロールの変更されたフラグ。それ以外の場所では、すべてのコントロールを以前の値にリセットするためにフォームの元に戻す必要があります。

私には2つのオプションがあるようです。 1.フォームコントロールを繰り返し実行する必要があるどこでも反復コードを繰り返します。私は新しいカスタムコントロールを作成する必要があるたびに好きではありません。いくつかの行を別のモジュール/クラスにX回追加する必要があります...非常に悪いプログラミング 2. 1つのフォーム反復プロシージャを作成して、その "集中化された"手続きの中の別のクラスに属していて、それは(1)より良いかもしれませんが、それほど好きではありません。

私はまだマスターしていないいくつかの.net機能を使用してより良い方法がありますか?

ありがとうございました。

+0

'For Each ctrl As MyTextBox frm.Controls.OfType(Of MyTextBox)で... ...その型だけをループし、その型として' ctrl'をキャストします。あなたは複数のループを行う必要があります。 – Plutonix

+0

@plutonix、yr answerのためのthksしかし、ロジックを変更しないで、同じコードを別のモジュールにコピー&ペーストして実装する必要があります –

答えて

0

コントロールからの反復処理は、コントロールが入れ子になっていることが多いため、扱いにくいことがあります。より制御されたアプローチは、あなたが追加したコントロールへの参照を保持する場所フォームに別のコレクションオブジェクトを追加することです.....

例えば

Dim My_Widgets as New List(of Your-Control-Class-Name) 

フォームにコントロールを作成するときにも追加それらをそのリストに追加します。

My_Widgets.Add(Widget_Object) 

その後、このリストを反復することは簡単です。

For Each Widget as My_Widget_CLass in My_Widgets 
    ' do what you need to do to Widget 
Next 

あなたは、直接個々のコントロールを参照する代わりに、辞書オブジェクトを使用する必要がある場合..

例えば

Dim My_Named_Widgets as new Dictionary(of String, Your-Control-Class-Name) 

次に名前で辞書にあなたのコントロールの参照を追加し

My_Named_WIdgets.add("<Whatever_You_USe_To_Identify_It>", Widget_Object) 
あなたはその後、IDによって特定のコントロールを参照することができます

または名前

My_Names_Widgets("ID").Property = Whatever '... etc 

あなたが持っている示しているように見えます他の目的のための他のコントロール、それはそれぞれのタイプのための同様のコレクションを作成することが賢明かもしれません。

+0

オリジナルのアイデアだが、それはプログラムのロジックを変更しないだろう、つまり、個別に収集することができます。フォームの構造の変更(メンテナンスのために危険)のために正しいコレクションを変更する必要があります。私はネストされたコントロールの再帰的な反復を好む –

関連する問題