2009-07-23 33 views
0

我使用Windows窗体编写简单的文本编辑器。与许多编辑人员一样,当文本更改标题栏时,标题旁边会显示一个星号,表明存在未保存的工作。当用户保存时,这会消失。如何检测C#中文本字段的先前状态?

但是,有一个问题。这是在主文本框的更改事件中处理的。但是,当打开文件或用户选择“新文件”时,这也会被调用,所以如果打开编辑器然后打开文件,程序会说有未保存的更改。什么是可能的解决方案?

我想到了一个全局变量,它表示文本是否以不应触发星号的方式改变,但必须有更好的方法。

回答

1

之前加载数据到文本框,未关联的第一事件处理程序用于改变

uxName.TextChanged -= uxName_TextChanged;  

uxName.Text = File.ReadAllText("something.txt"); 

uxName.TextChanged += uxName_TextChanged; 
0

C#中没有全局变量。你应该在你的表单中有一个变量作为一个实例变量(或者更好,在你的表单是一个视图的模型中),这是非常好的。

+0

这并不真实。您可以创建一个静态类并向该类添加静态变量。繁荣,全球变数。 – jasonh 2009-07-23 03:28:16

+0

静态变量不是全局的。它们是静态的。我知道这有些迂腐,但我觉得最好是用术语来精确。 – 2009-07-23 03:31:27

1

这是一个可怕的解决方案,但每次文本更改事件触发时,都会将文本框的值与某个变量进行比较,如果不同,则将文本框中的内容存储在变量中并添加星号。当通过“新建文件”对话框或任何其他不改变文本的事件调用该方法时,不会出现星号。

这对于真正的文本编辑器来说不是一个可行的解决方案,因为即使是中等大小的文件,内存也会很快失去控制。使用手指树或任何数据结构文本编辑器用来比较文本的“版本”是唯一真正有效的解决方案,但前提是相同的。

http://scienceblogs.com/goodmath/2009/05/finally_finger_trees.php

下面的第二张照片,他提到在文本编辑器中使用手指树实现一个非常便宜的“撤消”功能,但我敢肯定,你可以看到树的有效性您的问题作为好。

0

这是一个非常简单的和笨溶液。我会为此使用MVP设计模式,但这里是最快和最简单的解决方案:

//Declare a flag to block the processing of your event 
private bool isEventBlocked = false; 

private void OnTextChanged(object sender, EventArgs e) 
{ 
    if(!isEventBlocked) 
    { 
     //do your stuff 
    } 
} 

private void OnNewFile() //OR OnOpenFile() 
{ 
    try 
    { 
     isEventBlocked = true; 
     CreateFile(); 
    } 
    catch 
    { 
     //manage exception 
    } 
    finally 
    { 
     isEventBlocked = false; 
    } 
}