2016-04-14 39 views
0

Formu kapatırken sorun yaşanıyor ve hiçbir şey değişmemişse, yine de formu kaydetmeniz isteniyor. Çoklu kontrollere sahip bir formumuz var. Verilere sahip birkaç arama kutusu vardır. Verilerini seçiyorlar ve ardından "view" adında bir düğmeyi tıklıyorlar. Görünüm daha sonra birkaç metin kutusu ve açılan kutu vb. Getirir ve verilerle doldurulur. Ayrıca yüklenen bir RichEditControl da var. Tüm veriler yük olayında yüklendikten sonra. Son satır, tüm denetimler için olay işleyicilerini ayarlamak için aşağıdaki yöntemi çağırmaktır. Bundan sonra bir şey değiştiyse, form kapanışından tasarruf isteyin.RichEditControl olay işleyicisi, hiçbir şey değişmeden formda kaydetmeyi isteyen

customFunc.AddDirtyEvent(Me) 

konudur ve hiçbir richtextbox varsa biz test var, çalışıyor. Bir formdaki tek denetim bir RichEditControl ise, her ne olursa olsun, ne yük olursa olsun hiçbir şey değişmemiş olsa bile, kaydetmeyi ister. RichEditControl olan bir formunuz varsa ve form yüküne göre doldurulursa farkettim. Bundan sonra eventhandler'ı çağırsanız bile, eventhandler çağrısını formda görünen olaya eklerseniz, yine de BUT'u kaydetmenizi ister, kirli biti tekrar ayarlamadığı için çalışır gibi görünür. Neredeyse olayları gibi form yükleme olayın sonunda kuyruk vardır. Ama sonra gösterilen olaya gider, çağrı orada yapılır ve kirli bit geri doğru sıfırlanmaz.
Sorun bizim örneğimizde, gösterilen bir olayı kullanamayız, çünkü tüm verileri yükleyen ve RichEditControl'u dolduran bir "görünüm" düğmemiz vardır. Bu yüzden, veri aynı yöntemle yüklendikten sonra olay işleyicilerini eklesek bile, kirli biti doğruya ayarlamak için her zaman geri döner. Bundan sonra kirli biti false'a saklamamız gerekecek, bu yüzden eğer herhangi bir değişiklik yoksa ve sadece veriyi görüntülemek istiyorsanız, form kapanışından tasarruf edilmesini istemezler. Aşağıda benim kodum. RichEditControl.Modified mülk için SetIsDirty yöntem kontroller sırasında

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

ama normal bir RichTextBox denetiminin konuyu yinelenen olamaz. Bir şey, form yüklendikten sonra muhtemelen metni değiştiriyordur. Bir düğmeyi kullanarak 'customFunc.AddDirtyEvent (Me)' öğesini çağırmayı deneyin. – LarsTech

+0

evet kullandığımız DevExpress 13.2 – Sirus

+0

anladım eğer is_dirty = is_dirty –

cevap

0

. İşte
örnektir: DevExpress denetimleri yok

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

sayesinde Verileri yükledikten sonra False = değişken is_Dirty etkileyen kontrol 'is_dirty = TRUE ve' Eğer rtb.Modified = False 'sonra' is_dirty = is_Dirty OrElse rtb.Modified' 'True' olur, ancak' is_Dirty = rtb.Modified' '' False' olur. – Sirus

+0

@Sirus kaldırmak için gerekli dışında bu .. işe gibiydi RichEditControl içinde – nempoBu4