BobSki
BobSki

Reputation: 1552

Check to see if selection/text was changed in form

I have a form with about 20 controls on it (ComboBox, TextBox, etc) that I have pre-loaded with data. This is being displayed to the user and gives them the capability to change any of the fields.

I do not know the best way of recognizing that changes have taken place. After some research, I found TextBox.TextChanged and setting the flag IsDirty = True or something along those lines.

I don't think this will be 100% bulletproof since the user might change the value and then go back and change it to how it was when initially loaded. I've been thinking about saving the current data to .Tag and then comparing it with the .Text that was entered when the user clicks "Cancel" to simply ask them if they'd like to save the changes.

This is my code:

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

This is the code for when the user clicks "Cancel":

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

Is this an effective way to do this? Can it be relied on? If anyone has any better idea, I'd love to hear it.

Upvotes: 2

Views: 7595

Answers (2)

soohoonigan
soohoonigan

Reputation: 2350

I know this already has an accepted answer, but I thought the part about checking if the actual text value has changed should be addressed. Checking modified will reveal if any changes were made to the text, but it will fail if the user, for example, adds a character and then deletes it. I think a good way to do this would be with a custom control, so here's an example of a simple control that stores the textbox's original text whenever it is changed programmatically, and has a textaltered property that can be checked to show whether or not the user's modifications actually resulted in the text being different from its original state. This way, each time you fill the textbox with data yourself, the value you set is saved. Then when you are ready, you just check the TextAltered property:

Public Class myTextBox
    Inherits System.Windows.Forms.TextBox
    Private Property OriginalText As String
    Public ReadOnly Property TextAltered As Boolean
        Get
            If OriginalText.Equals(MyBase.Text) Then
                Return False
            Else
                Return True
            End If
        End Get
    End Property
    Public Overrides Property Text As String
        Get
            Return MyBase.Text
        End Get
        Set(value As String)
            Me.OriginalText = value
            MyBase.Text = value
        End Set
    End Property
End Class

Upvotes: 3

Bugs
Bugs

Reputation: 4489

Have a look at this:

For Each txtBox In Me.Controls.OfType(Of TextBox)()
    If txtBox.Modified Then
        'Show message
    End If
Next

EDIT

Have a look at this. This may be of interest to you if you wanted an alternative way to the .Tag property:

'Declare a dictionary to store your original values
Private _textboxDictionary As New Dictionary(Of TextBox, String)

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    'You would place this bit of code after you had set the values of the textboxes
    For Each txtBox In Me.Controls.OfType(Of TextBox)()
        _textboxDictionary.Add(txtBox, txtBox.Text)
    Next

End Sub

Then use this to find out the original value and compare to the new value:

For Each txtBox In Me.Controls.OfType(Of TextBox)()
    If txtBox.Modified Then
         Dim oldValue = (From kp As KeyValuePair(Of TextBox, String) In _textboxDictionary
                         Where kp.Key Is txtBox
                         Select kp.Value).First()
         If oldValue.ToString() <> txtBox.Text Then
             'Show message
         End If

    End If
Next

Upvotes: 3

Related Questions