【问题标题】:Check to see if selection/text was changed in form检查选择/文本是否在表单中更改
【发布时间】:2017-03-10 05:49:06
【问题描述】:

我有一个表单,上面有大约 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

这是一种有效的方法吗?可以依靠吗?如果有人有更好的想法,我很想听听。

【问题讨论】:

  • 有一些内置的方法。一个是Modified 属性。您还可以与源(如数据表)进行比较,而不是使用Tag。另一个是如果您使用绑定控件,数据表会将行标记为已更改。不过,我认为它也不会发生变化。
  • 您可以将自定义控件添加到继承文本框的项目中,并重载其 .Text 方法以在每次以编程方式设置文本时将文本框的内容保存到 OriginalText 属性。然后,您只需要添加另一个只读属性,该属性将文本框的当前文本与其原始文本进行比较,如果有任何文本发生更改,则返回 True

标签: vb.net controls textchanged dirty-data


【解决方案1】:

看看这个:

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

【讨论】:

    【解决方案2】:

    我知道这已经有一个可接受的答案,但我认为应该解决有关检查实际文本值是否已更改的部分。检查修改将显示是否对文本进行了任何更改,但如果用户添加一个字符然后删除它,它将失败。我认为一个很好的方法是使用自定义控件,所以这里有一个简单控件的示例,它在以编程方式更改文本框时存储文本框的原始文本,并且有一个 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
    

    【讨论】:

    • 我正在考虑沿着课程路线走下去,我很高兴有人确实将其作为答案显示出来,因为从技术上讲它更好。很遗憾标准控件还不支持它,因为我相信很多人都会喜欢它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 1970-01-01
    • 2013-05-14
    • 1970-01-01
    • 2014-07-10
    • 2014-05-31
    相关资源
    最近更新 更多