【发布时间】:2017-03-10 05:49:06
【问题描述】:
我有一个表单,上面有大约 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
这是一种有效的方法吗?可以依靠吗?如果有人有更好的想法,我很想听听。
【问题讨论】:
-
有一些内置的方法。一个是
Modified属性。您还可以与源(如数据表)进行比较,而不是使用Tag。另一个是如果您使用绑定控件,数据表会将行标记为已更改。不过,我认为它也不会发生变化。 -
您可以将自定义控件添加到继承文本框的项目中,并重载其 .Text 方法以在每次以编程方式设置文本时将文本框的内容保存到 OriginalText 属性。然后,您只需要添加另一个只读属性,该属性将文本框的当前文本与其原始文本进行比较,如果有任何文本发生更改,则返回 True
标签: vb.net controls textchanged dirty-data