Проверьте, был ли выбран / текст был изменен в форме

У меня есть форма с около 20 элементов управления (ComboBox, TextBoxи т. д.) которые я предварительно загрузил с данными. Это отображается для пользователя и дает им возможность изменить любое из полей.

Я не знаю лучшего способа признать, что изменения произошли. После некоторых исследований я нашел TextBox.TextChanged и установка флага IsDirty = True Или что-то вдоль этих линий.

Я не думаю, что это будет на 100% пуленепробиваемым, так как пользователь может изменить значение, а затем вернуться и изменить его на то, что было при первоначальной загрузке. Я думал о сохранении текущих данных в .Tag а затем сравнивая его с .Text это было введено, когда пользователь нажимает "Отмена", чтобы просто спросить его, хотят ли они сохранить изменения.

Это мой код:

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

Это код, когда пользователь нажимает кнопку "Отмена":

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

Это эффективный способ сделать это? На что можно положиться? Если у кого-то есть идея получше, я бы хотел ее услышать.

2 ответа

Решение

Посмотри на это:

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

РЕДАКТИРОВАТЬ

Посмотри на это! Это может быть интересно для вас, если вы хотели альтернативный путь к .Tag имущество:

'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

Затем используйте это, чтобы узнать исходное значение и сравнить с новым значением:

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

Я знаю, что на это уже есть принятый ответ, но я подумал, что часть о проверке, изменилось ли фактическое значение текста, должна быть рассмотрена. Проверка изменения покажет, были ли внесены какие-либо изменения в текст, но произойдет сбой, если пользователь, например, добавит символ, а затем удалит его. Я думаю, что хороший способ сделать это был бы с помощью пользовательского элемента управления, так что вот пример простого элемента управления, который сохраняет исходный текст текстового поля всякий раз, когда он изменяется программно, и имеет свойство textaltered, которое можно проверить, чтобы показать, действительно ли Пользовательские изменения фактически привели к тому, что текст отличался от его исходного состояния. Таким образом, каждый раз, когда вы сами заполняете текстовое поле данными, установленное вами значение сохраняется. Затем, когда вы будете готовы, вы просто проверяете свойство TextAltered:

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
Другие вопросы по тегам