データがあらかじめロードされているフォームが約20個あります(ComboBox
、TextBox
など)。これはユーザーに表示され、フィールドのいずれかを変更する機能をユーザーに提供します。選択/テキストが書式で変更されているかどうかを確認してください。
変更が行われたことを認識する最良の方法はわかりません。いくつかの調査の後、私はTextBox.TextChanged
を見つけて、その行に沿ってフラグIsDirty = True
か何かを設定しました。
ユーザーは値を変更してから最初に読み込んだときの状態に戻す可能性があるため、これは100%防弾にはならないと思います。私は現在のデータを.Tag
に保存し、ユーザーが「キャンセル」をクリックして変更を保存するかどうかを尋ねるときに入力した.Text
と比較することを考えていました。
これは私のコードです:
Private Sub Form1_Load(ByVal sender as Object, byVal e as System.EventArgs)Handles MyBase.Load
For Each ctr as Control in me.Controls
if typeof ctr is TextBox then
ctr.tag=ctr.text
end if
Next
End Sub
これは、ユーザーが「キャンセル」をクリックするときのためのコードです:
Private Sub CmdCancel_Click (ByVal sender as Object, ByVal e As System.EventArgs) Handles CmdCancel.Click
For each ctr As Control in Me.Controls
If Typeof ctr is Textbox then
if ctr.tag.tostring <> ctr.text then
MsgBox ("Do you want to save the items", YesNo)
end if
End if
Next
End sub
が、これは、これを行うために効果的な方法ですか?それは信頼できるのだろうか?誰かがもっと良いアイデアを持っているなら、私はそれを聞いてみたい。
組み込みの方法がいくつかあります。一つは 'Modified'プロパティです。また、 'Tag'を使うのではなく、(データテーブルのような)ソースと比較することもできます。もう1つは、バインドされたコントロールを使用する場合、データテーブルは変更された行をマークすることです。私はそれがどちらかの変更変更のバック状況をキャッチするとは思わない。 – Plutonix
テキストボックスを継承するプロジェクトにカスタムコントロールを追加し、そのテキストがプログラマチックに設定されるたびにTextBoxの内容をOriginalTextプロパティに保存するために.Textメソッドをオーバーロードすることができます。次に、テキストボックスの現在のテキストと元のテキストを比較するreadonlyプロパティを1つ追加し、テキストが変更されている場合はTrueを返します。 – soohoonigan