コレクションを使って、モードを切り替えることは簡単です。
例えば9月18日の[CtrlBindingCollection]クラスに次のメソッドを追加します。
Sub モード設定(ByVal blnEdit As Boolean)
For i As Integer = 0 To m_lst.Count - 1
m_lst(i).モード設定(blnEdit)
Next
End Sub
m_lst(i).モード設定(blnEdit)という怪しげなコードがありますが、要は[編集モード]にしたいときはそのコントロールがButtonなら[Enable = False]、TextBoxなら[Readonly = False]にするだけです。
すこし厄介なのは、画面上のコントロールに触ったとき、直ちに[編集モード]([修正]作業)に切り替える仕組みです。
やりたいことは、当該のコントロールが[TextBox(Base)]のときは[TextChanged]イベント、[ListBox]のときは[SelectIndexChanged]イベントが発生したとき、コントロールの入力データが編集されたとみなし、[編集]作業用ルーティンをコールすることです。
ここで、引数のない[Sinki]、[Shusei]、[Sakujo]等のメソッドを用意し、[新規]、[修正]、[削除]等のボタンのクリックイベントでこれらのメソッドをコールするようにします(無理に引数のないメソッドにすつこともないのですが、説明も楽ですので…)。
すなわち、れぞれのボタンをクリックすれば、それぞれのメソッドを起動し[新規]、[修正]、[削除]等の作業に入ります。
さて、TextBox等が[編集]されればこの[修正]メソッドをコールするようにしたいのです。
次にこれを処理するクラスをご紹介します。
本当はもっと複雑ですが、本質部分はこのようなものです。
Public Class Set2Changed
Private m_dlg修正メソッド As System.Action
Sub New(ByRef 修正 As System.Action, ByRef ctrls() As Control)
Me.m_dlg修正メソッド = 修正
For Each ctrl As Control In ctrls
SetChangedHandler(ctrl)
Next
End Sub
Private Sub SetChangedHandler(ByRef ctrl As Control)
If TypeOf (ctrl) Is TextBoxBase Then
AddHandler ctrl.TextChanged, AddressOf MyTextChanged
ElseIf TypeOf (ctrl) Is ListControl Then
AddHandler CType(ctrl, ListControl).SelectedIndexChanged, AddressOf MySelectedIndexChanged
ElseIf TypeOf (ctrl) Is ButtonBase Then
AddHandler CType(ctrl, ButtonBase).CheckedChanged, AddressOf MyCheckedChanged
End If
End Sub
Private Sub MyTextChanged(ByVal sender As Object, ByVal e As System.EventArgs)
m_dlg修正メソッド.Invoke()
End Sub
' その他、[MySelectedIndexChanged][MyCheckedChanged]等も準備します
End Class
Formからこのクラスのインスタンスを作成しますが、このときそのFormの[修正]メソッドと、監視するコントロールの集合(実際にはコレクション)を渡します。
メソッド[SetChangedHandler]では、これらのコントロールのデータが修正されると、修正デリゲートが起動するイベントハンドラを各コントロールに付加しています。
これだけで、画面の各コントロールの修正にかかると、[修正]作業に入り、[モード設定]をコールすることにより[編集モード]になります。