2016-04-14 11 views
0

フォームを閉じるときに問題が発生し、何も変更されていない場合でもフォームを保存するよう求められます。私たちは複数のコントロールを持つフォームを持っています。データを持ついくつかの検索コンボボックスがあります。彼らは自分のデータを選択し、 "ビュー"と呼ばれるボタンをクリックします。次に、いくつかのテキストボックスとコンボボックスなどが表示され、データが入力されます。 RichEditControlもロードされます。すべてのデータがロードイベントでロードされた後。最後の行は、次のメソッドを呼び出して、すべてのコントロールのイベントハンドラを設定することです。その後何かが変更された場合は、フォームの終了時に保存を促します。RichEditControlイベントハンドラ、フォームの終了時に何も保存せずに保存するように変更しました

customFunc.AddDirtyEvent(Me) 

リッチテキストボックスがない場合は問題あり、テストしています。フォーム上の唯一のコントロールがRichEditControlの場合、ロード時に何も変更されていなくても、何があっても保存するように常に求められます。 RichEditControlのフォームがあり、フォームの読み込み時にデータが取り込まれることに気付きました。それ以降のイベントハンドラを呼び出しても、イベントハンドラの呼び出しをフォームのイベントに追加すると保存するように求められますが、ダーティビットを再び設定しないため動作しているようです。ほとんどのイベントは、フォームロードイベントの最後にキューされています。しかし、それが示されたイベントに行くと、呼び出しが行われ、ダーティービットは真にリセットされません。
すべてのデータをロードして、RichEditControlを生成するボタン「ビュー」があるため、問題が発生した場合は、表示されたイベントを使用できません。したがって、同じメソッドでデータがロードされた後にイベントハンドラを追加しても、常にダーティビットをtrueに設定するように戻ります。この後に汚れたビットをfalseにしておく必要があります。変更がなく、単にデータを表示したい場合は、フォームの終了時に保存するように求めるメッセージは表示されません。以下は私のコードです。 RichEditControl.ModifiedプロパティのためのあなたのSetIsDirty方法のチェックで

If customFunc.IsDirty = True Then 
    Dim dr As DialogResult = MessageBox.Show("Do you want save changes before leaving?", "Closing Mud Report", MessageBoxButtons.YesNoCancel, MessageBoxIcon.Warning, MessageBoxDefaultButton.Button2) 
    If dr = Windows.Forms.DialogResult.Yes Then 
     SimpleButtonSave.PerformClick() 
    ElseIf dr = Windows.Forms.DialogResult.Cancel Then 
     e.Cancel = True 
    End If 
End If 

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

Public Sub AddDirtyEvent(ByVal ctrl As Control) 
    For Each c As Control In ctrl.Controls 
     If TypeOf c Is RichEditControl Then 
      Dim rtb As RichEditControl = CType(c, RichEditControl) 
      AddHandler rtb.RtfTextChanged, AddressOf SetIsDirty 
     End If 

     If c.Controls.Count > 0 Then 
      AddDirtyEvent(c) 
     End If 
    Next 
End Sub 
+0

私はDevExpress社のコントロールを持っていないが、私は通常のRichTextBoxコントロールの問題を複製することはできません。フォームが読み込まれた後に何かがテキストを変更している可能性があります。代わりに 'customFunc.AddDirtyEvent(Me)'をボタンクリックから手動で呼び出してテストしてみてください。 – LarsTech

+0

はい私たちはdevexpressコントロールを使用しています13.2 – Sirus

+0

RichEditControlでデータをロードした後に変数is_Dirty = Falseに影響していると理解していれば –

答えて

0

。ここ
は一例です:

Private Sub SetIsDirty(ByVal sender As System.Object, ByVal e As System.EventArgs) 
    If TypeOf sender Is RichEditControl Then 
     Dim rtb As RichEditControl = CType(sender, RichEditControl) 
     is_Dirty = is_Dirty OrElse rtb.Modified 
    Else 
     is_Dirty = True 
    End If 
End Sub 
+0

これはうまくいきました.. is_dirty = is_dirtyを削除する必要性を除いて – Sirus

+0

@Suis 'is_dirty = True'および' rtb.Modified = False'、それから 'is_dirty = is_Dirty OrElse rtb.Modified'は' True'になりますが、 'is_Dirty = rtb.Modified'は' False'になります。 – nempoBu4

関連する問題