检查选择/文本是否在表单中更改

时间:2016-10-27 13:50:32

标签: vb.net controls textchanged dirty-data

我有一个包含大约20个控件的表单(ComboBoxTextBox等),我预先加载了数据。这将显示给用户,并使他们能够更改任何字段。

我不知道识别变化的最佳方式。经过一些研究,我发现了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 个答案:

答案 0 :(得分:3)

看看这个:

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

答案 1 :(得分:3)

我知道这已经有了一个已接受的答案,但我认为应该解决关于检查实际文本值是否已更改的部分。检查已修改将显示是否对文本进行了任何更改,但如果用户添加了一个字符然后将其删除,则会失败。我认为这样做的一个好方法是使用自定义控件,所以这里是一个简单控件的示例,它以编程方式更改文本框的原始文本,并具有可以检查以显示是否为用户的修改实际上导致文本与其原始状态不同。这样,每次用自己的数据填充文本框时,都会保存您设置的值。然后,当您准备好时,只需检查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