Проверьте, был ли выбран / текст был изменен в форме
У меня есть форма с около 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