2016-04-08 11 views
0

vb.net/devエクスプレスツールを使用しています。私たちはいくつかのコントロールのテキストボックス、コンボなどを持っています...変更された各値をチェックするのではなく、すべてのコントロールを調べて何かが編集されているかどうかをチェックし、以下は私がこれを達成しようとしたいくつかのコードです。問題は、それは技術的には動作しますが...再帰AddDirtyEvent(c)を使用するので、フォームを閉じて[はい]をクリックして保存します。複数のコントロールのためにメッセージボックスを複数回呼び出す...それは働かず、汚れた変化を検出しません。私はちょうど...私はこれは私がしたいか、もっと簡単な方法がある場合のように動作するように取得する方法コントロールが変更されていないかチェックし、フォーム終了時にデータを保存します

Dim is_Dirty As Boolean = False 

    Private Sub AddDirtyEvent(ByVal ctrl As Control) 

    For Each c As Control In ctrl.Controls 
     If TypeOf c Is TextEdit Then 
      Dim tb As TextEdit = CType(c, TextEdit) 
      AddHandler tb.EditValueChanged, AddressOf SetIsDirty 

     End If 
     'If TypeOf c Is ComboBoxEdit Then 
     ' Dim cb As ComboBoxEdit = CType(c, ComboBoxEdit) 
     ' AddHandler cb.SelectedIndexChanged, AddressOf SetIsDirty 

     'End If 
     If c.Controls.Count > 0 Then 
      AddDirtyEvent(c) 
     End If 

    Next 

End Sub 

Private Sub SetIsDirty(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    is_Dirty = True 
End Sub 

Private Sub Form1_FormClosing(sender As Object, e As FormClosingEventArgs) Handles Me.FormClosing 

    If is_Dirty = True Then 
     Dim dr As DialogResult = MessageBox.Show("Do you want save changes before leaving?", "Closing Well Info", MessageBoxButtons.YesNo, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) 
     If dr = Windows.Forms.DialogResult.Yes Then 
      SimpleButtonSave.PerformClick() 
      Me.Close() 
     End If 
    End If 
End Sub 

答えて

0

イベントを処理し、ダーティフラグがOKに動作設定あなたのコードの一部を思ったんだけど。

イベントハンドラ内でMe.Closeを呼び出しているため、MessageBoxが複数回表示されます。 Closeを呼び出すと、再帰的にFormClosingイベントがトリガーされます。 Me.Closeを削除してください。フォームはすでに終了しています。

+2

Sirus、これはあなたの問題を解決します(とき)場合、未回答の一覧をオフにこれを移動するには、チェックマークをクリックしてください。何もありませんが、あなたには数多くの質問があり、答えは受け入れられません。 – Plutonix

+0

okありがとう..別の質問があります。私たちはグリッドコントロールとグリッドビューを持っています。 gridiviewはgridcontrolの中にあり、私はフォーム上のコントロールを見つけようとしています。gridviewは見つかりませんが、gridcontrolを見つけることができます。しかし、グリッドコントロールが見つかったら、グリッドビュー内の何かが変更された場合は変更する必要があります...任意のアイデア – Sirus

0

私はMSのアクセスプログラマーとして、vb.netのフォームダーティープロパティーの実装を開発したいと思っていましたが、コントロールの変更を検出するためにユーザーフレンドリーで(そしてユーザーも使い慣れている)フォーム上にあるか汚れたフォームを残して、古典的な編集と保存ボタンではなく確認を求めてください。 以前は、テキストボックス、コンボボックス、リストボックスなどのライブラリのカスタムコントロールを作成しました。異なる背景とテキストなどのズーム機能を持つコントロールが好きなので...

(テキストボックスコード):

> Protected Overrides Sub OnModifiedChanged(e As EventArgs) 
>  MyBase.OnModifiedChanged(e) 
>  If _DirtyEnabled and Me.Modified Then FormDirty(Me) = Me.Modified 
> End Sub 
> Private _DirtyEnabled As Boolean = False 
> <Category("Misc"), Description("When Enabled triggers Dirty event for form"), Browsable(True)> _ 
> Public Property DirtyEnabled As Boolean 
>  Get 
>   Return _DirtyEnabled 
>  End Get 
>  Set(value As Boolean) 
>   DirtyEnabled = value 
>  End Set 
> End Property 

これは私がSelectIndexChangedイベントを使用コンボボックスやリストボックスの場合、テキストボックスのためのものです。 DirtyEnabledプロパティがTrueに設定されていると、変更によってFormDirtyプロパティの呼び出しがトリガされます。 その後、ライブラリのパブリックモジュールに:

> #Region "Dirty" 
> Private Structure FormInfo ' used in DirtyForm dictionary to keep a list of dirty forms 
>  Dim Name As String 
>  Dim Time As Date 
>  Dim Ctrl As String 
> End Structure 
> Private DirtyForms As New Dictionary(Of IntPtr, FormInfo)  ' key = form handle as the form could be opened more then once, value FormInfo 
> 
>  Public Property FormDirty(frm As Form) As Boolean 
>  Get 
>   If DirtyForms.Count > 0 Then 
>    Return DirtyForms.ContainsKey(frm.Handle) 
>   Else 
>    Return False 
>   End If 
>  End Get 
>  Set(IsDirty As Boolean) 
>   EditDirtyForms(frm, IsDirty) 
>  End Set 
> End Property 
> 
> Public Property FormDirty(Ctrl As Control) As Boolean 
>  Get 
>   If DirtyForms.Count > 0 Then 
>     Return DirtyForms.ContainsKey(Ctrl.FindForm.Handle) 
>    Else 
>     Return False 
>    End If 
>  End Get 
>  Set(IsDirty As Boolean) 
>   EditDirtyForms(Ctrl.FindForm, IsDirty, Ctrl.Name) 
>  End Set 
> End Property 
> 
> Private Sub EditDirtyForms(frm As Form, IsDirty As Boolean, Optional CtrlName As String = Nothing) 
>  If IsDirty Then 
>   If DirtyForms.Count = 0 OrElse Not DirtyForms.ContainsKey(frm.Handle) Then 
>    Dim Info As New FormInfo With {.Name = frm.Name, .Time = Now, .Ctrl = CtrlName} 
>    DirtyForms.Add(frm.Handle, Info) 
>   End If 
>  ElseIf DirtyForms.Count > 0 Then 
>   If DirtyForms.ContainsKey(frm.Handle) Then DirtyForms.Remove(frm.Handle) 
>  End If 
> End Sub 
> 
> Public Function DirtyFormList() As String 
>  Dim p As New FormInfo, s As String = String.Empty 
>  If DirtyForms.Count > 0 Then 
>   For Each f As KeyValuePair(Of IntPtr, FormInfo) In DirtyForms 
>    s &= f.Value.Name & cSpace & If(f.Value.Ctrl, String.Empty) & ": " & f.Value.Time & vbNewLine 
>   Next 
>  End If 
>  Return s 
> End Function 
> 
> Public Function DirtyFormCount() As Integer 
>  Return DirtyForms.Count 
> End Function 
> #End Region 

フォームが保存それはテスト段階ではまだだ、まだ利用者などからの確認を求めミスFormdirty(私)= Falseの を呼ぶだろう... それはしかし作品私は全く新しいコメントを書くことができます。

RGDS

関連する問題