检查 selection/text 是否更改了表格
Check to see if selection/text was changed in form
我有一个表单,上面有大约 20 个控件(ComboBox
、TextBox
等),我已经预先加载了数据。这将显示给用户并使他们能够更改任何字段。
我不知道识别已发生变化的最佳方式。经过一些研究,我发现 TextBox.TextChanged
并设置标志 IsDirty = True
或类似的东西。
我不认为这将是 100% 的防弹,因为用户可能会更改值然后返回并将其更改为最初加载时的状态。我一直在考虑将当前数据保存到 .Tag
,然后将其与用户单击 "Cancel" 时输入的 .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
这是用户点击时的代码 "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
这是一种有效的方法吗?可以依靠吗?如果有人有更好的主意,我很想听听。
看看这个:
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 属性:
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
我有一个表单,上面有大约 20 个控件(ComboBox
、TextBox
等),我已经预先加载了数据。这将显示给用户并使他们能够更改任何字段。
我不知道识别已发生变化的最佳方式。经过一些研究,我发现 TextBox.TextChanged
并设置标志 IsDirty = True
或类似的东西。
我不认为这将是 100% 的防弹,因为用户可能会更改值然后返回并将其更改为最初加载时的状态。我一直在考虑将当前数据保存到 .Tag
,然后将其与用户单击 "Cancel" 时输入的 .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
这是用户点击时的代码 "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
这是一种有效的方法吗?可以依靠吗?如果有人有更好的主意,我很想听听。
看看这个:
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 属性:
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