• Sử dụng Dirty event của Form
  • Sử dụng Dirty event của Form

    huylam > 29-02-12, 05:51 PM

    Chào các bạn!
    Mình đang gặp một vấn đề khi làm theo thí dụ của Microsoft MSDN online tại link này: http://msdn.microsoft.com/en-us/library/...e.11).aspx. Ý nghĩa demo của nó là khi thay đỗi dữ liệu trên form (có thể là các text box) thì nút Undo sẽ được bật lên cho phép người dùng có thể undo để lấy lại giá trị ban đầu của nó.

    Mình đã làm 2 trường hợp:

    Trường hợp 1: Làm giống theo source code Example(Sử dụng sự kiện Private Sub Form_Dirty(Cancel As Integer)):
    Nút Undo không bao giờ được bật vì Me.Dirty luôn luôn = false

    Sourde code:
    Private Sub Form_Dirty(Cancel As Integer)
    If Me.Dirty Then
    Me!btnUndo.Enabled = True ' Enable button.
    Else
    Me!btnUndo.Enabled = False ' Disable button.
    End If
    End Sub

    Sub btnUndo_Click()
    Dim ctlC As Control
    ' For each control.
    For Each ctlC in Me.Controls
    If ctlC.ControlType = acTextBox Then
    ' Restore Old Value.
    ctlC.Value = ctlC.OldValue
    End If
    Next ctlC
    End Sub

    Trường hợp 2: Thay thế Private Sub Form_Dirty() bằng event của 1 text box (DCHI : Địa chỉ) trên Form cho giống với giải thích của Microsoft (The following example enables the btnUndo button when data is changed. The UndoEdits( ) subroutine is called from the Dirty event of text box controls. Clicking the enabled btnUndo button restores the original value of the control by using the OldValue property.)
    Nút Undo được bật khi khi sự kiện Dirty của Textbox xảy ra ở lần thứ 2(Lần đầu khi thay đổi giá trị vẫn không bật lên vì Me.Dirty = false)

    Source Code:
    Private Sub DCHI_Dirty(Cancel As Integer)
    UndoEdits
    End Sub
    Sub UndoEdits()
    If Me.Dirty Then
    Me!btnUndo.Enabled = True ' Enable button.
    Else
    Me!btnUndo.Enabled = False ' Disable button.
    End If
    End Sub

    Private Sub btnUndo_Click()
    Dim ctlC As Control
    ' For each control.
    For Each ctlC In Me.Controls
    If ctlC.ControlType = acTextBox Then
    ' Restore Old Value.
    ctlC.Value = ctlC.OldValue
    End If
    Next ctlC
    End Sub
    --------------------------------------------
    Lưu ý thêm là khi mình debug thì trong cả 2 trường hợp khi xảy ra sự kiện thì giá trị của các text box mình vừa thay đổi trên form sẽ không lấy được trong Dirty Event, mà nếu không lấy được giá trị mới thì sao mà biết đường xử lý dữ liệu và ngăn không cho chỉnh sửa dữ liệu trên đó bằng cách set giá trị Cancel = true.

    Mình mong muốn là khi có bất kỳ thay đỗi dữ liệu trên các control trên form là nút undo sẽ được bật lên liền và ngược lại khi không có thay đỗi gì thì nút undo sẽ chìm xuống.

    Rất mong mọi người giải thích dùm và nếu ai biết rõ về sự kiện Dirty này có thể làm 1 demo khác dùm mình vì demo này thấy không ổn!
    Chân thành cảm ơn.
  • RE: Sử dụng Dirty event của Form

    tanthuc > 08-10-12, 05:12 PM

    Mình cũng đang gặp trường hợp này, nếu bạn có giải pháp cho mình biết với, thank

    Ví dụ trên chỉ đúng trong trường hợp textbox.dirty thôi đã được gi rõ trong tài liệu của microsoft, hình như mình không thấy vi dụ về form.dirty

    KeyDown > KeyPress > BeforeInsert > Dirty > KeyUp ... >form before update
    >>>>>>>>>>>>>>>>>>>>>>>>>>>>>dirty=false dirty=true

    ==> voi single form thi tinh hinh co ve don gian

    Nều có subform ????

    Hihi minh lam thế này

    Dim flagMain As Integer 'tao cái cờ trong form

    Private Sub Form_Load()
    flagMain = 0 'khởi tạo biến
    End Sub

    Private Sub btn_cancel_Click()
    If Me.Dirty Then
    Me.Undo 'bi sua tren mainform
    Else
    If flagMain = 1 Then
    MsgBox "main form dã bi update" ' user sau khi sửa trên form và tiếp tục sửa trên subform
    'delete current record + delete toàn bộ row trong subform
    Else
    MsgBox "main form va con nguyen tem"
    ' thoải mái docmd.close
    End If
    End If

    End Sub

    Private Sub Form_Dirty(Cancel As Integer)
    flagMain = 1 'có động thái vào vào form main -> bật cờ
    End Sub

    -----------------
    Có vẻ hữu hiệu, mời các bạn thảo luận thêm :d
  • RE: Sử dụng Dirty event của Form

    vkaccess > 07-12-17, 05:31 AM

    Mình cũng đang tìm hiểu vấn đề này, các bạn hướng dẫn mình cách sử dụng thằng Oldvalue với. Mình làm thử mà không được