2014-02-05 54 views
1

好吧,那里有很多例子,但它们不是我正在寻找的。检查文本在VB.NET文本框中是否有变化

我的VB.NET应用程序加载并读取XML文件以填充文本框。然后,用户可以更改文本并保存。但是如果用户去做其他事情,比如在下拉框中更改选择内容,我希望它弹出一个对话框,警告他们文本没有保存,并让他们选择放弃更改,保存更改等。 。

关于如何最好地实现这一点的任何想法?我是否创建隐藏的文本框并对其进行比较?我觉得我正在设计一些非常容易完成的工作。

在此先感谢。

[更新] - 由于文本数量很少,因此我将使用两个文本框,然后比较结果,但这里是MsgBox的问题。无论如何,它总是认为我点击是。想法还是应该去一个新的Q?

这里是我的测试代码:

Private Sub ComboBox1_SelectedIndexChanged(sender As Object, e As EventArgs) Handles ComboBox1.SelectedIndexChanged 
    If txtDetails.Text <> txtDetailsCOPY.Text Then 
     MsgBox("You changed text." & vbCrLf & "To save it, click YES" & vbCrLf & "To discard the changes, click NO.", MsgBoxStyle.YesNo, "Text Changed!") 
     If MsgBoxResult.Yes Then 
      MsgBox("You clicked YES") 
     ElseIf MsgBoxResult.No Then 
      MsgBox("You clicked NO") 
     End If 
    ElseIf txtDetails.Text = txtDetailsCOPY.Text Then 
     'MsgBox("Nothing changed!") 
     Exit sub 
    End If 
End Sub 
+0

我认为保存不必发生,直到用户试图离开对话框,更正? –

+2

一种方法是听'TextChanged'事件。如果这是自文本框的内容被设置以来发生的,那么当前内容可能与原始内容不同。 –

+0

@RobertHarvey - 那是对的。我试图在所有情况下“防止”用户丢失输入信息的问题。 – CJSoldier

回答

-1

一般来说,你将在你的显示数据的内存中表示模型IE的。当文本框更新时,它将在该模型中设置一个属性。然后模型知道它通过设置脏标志或我保留原始模型的副本而改变。当你去加载一个新的模型时,你会检查你创建的机制是否曾经保存过以前的模型。然后你弹出对话框。不要将文本框用作数据存储。

0

我会推迟保存的决定,直到用户点击包含文本框的对话框上的取消或确定按钮。如果这不可行,那么使文本框为只读,提供编辑按钮,并打开模式对话框来编辑文本框。

用户在离开文本框时发生消息框问题是它极具破坏性。从用户的角度来看,消息框是最昂贵的可能的认知元素;它们代表完全中断。当用户评估如何处理消息框时,一切都会停止。这就是为什么用户经常忽视它们,并且在没有正确评估它们的情况下驳回它们,即使它们很重要。所以不要为此使用它们。

如果您有多个文本框,请考虑实施“脏跟踪”。 https://www.google.com/search?q=form.dirty+winforms

+0

这也是我的想法(消息框 - 执行保存,取消等规则太松散)几乎就像我需要某种编辑器形式... – CJSoldier

1

您可以添加布尔标志,例如textNotSaved作为标志。在您的文本框的text_changed事件中,您可以将该标志设置为true。无论何时保存文本,都可以将其设置为False。每当发生任何其他事件时,比如说,按钮上的点击事件,检查标志是否为真;如果是,则例如在消息框的帮助下提示用户。 希望这有助于。