如何检测C#中文本字段的先前状态?

如何检测C#中文本字段的先前状态?,c#,winforms,text-editor,C#,Winforms,Text Editor,我正在使用Windows窗体编写一个简单的文本编辑器。与许多编辑器一样,当文本更改时,标题栏会在标题旁边显示一个星号,表示有未保存的工作。当用户保存时,这就消失了 然而,有一个问题。这在主文本框的更改事件中处理。但是,当打开文件或用户选择“新建文件”时,也会调用此函数,因此,如果打开编辑器然后打开文件,程序会说有未保存的更改。什么是可能的解决方案 我想用一个全局变量来表示文本是否以不触发星号的方式更改,但必须有更好的方式。C#中没有全局变量。在表单中(或者更好的是,在表单是视图的模型中)应该有这

我正在使用Windows窗体编写一个简单的文本编辑器。与许多编辑器一样,当文本更改时,标题栏会在标题旁边显示一个星号,表示有未保存的工作。当用户保存时,这就消失了

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


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

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

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

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


在第二张图片下方,他提到了在文本编辑器中使用手指树来实现一个非常便宜的“撤销”功能,但我相信您也可以看到树对您的问题的有效性。

在将数据加载到文本框之前,先解除与eventhandler的关联以进行更改

uxName.TextChanged -= uxName_TextChanged;    

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

uxName.TextChanged += uxName_TextChanged;

这是一个非常简单和愚蠢的解决方案。对此,我会使用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;
    }
}

这不太准确。您可以创建一个静态类并向该类添加静态变量。Boom,全局变量。静态变量不是全局变量。它们是静态的。我知道这有点迂腐,但我发现最好是精确地使用术语。对不起,我指的是表单的实例变量。但我还是不喜欢这个解决方案。@Pavel:它们怎么不是全球性的呢?到底有什么区别?从技术上讲,因为它们是“静态”的,而不是全局的。本质上它们是同一件事,但技术上它们不是。这只是语义学。没有冒犯的意思,但这似乎是对我正在尝试的工作的过度使用。好吧,你似乎是为了好玩而编写一个文本编辑器。在我看来,实现一个很酷的数据结构(比如手指树)是非常酷的。