.net 用替换字符串中的相同单词替换字符串

.net 用替换字符串中的相同单词替换字符串,.net,string,vb.net,winforms,.net,String,Vb.net,Winforms,我有一个文本框,如果我输入“Dog”,我的应用程序应该用“可爱的狗”替换“Dog”。但当我试着运行它时,会生成大量的文本,因为它在“可爱的狗”中找到了“狗”,而它刚刚替换了。代码如下: txtMain.Text = Microsoft.VisualBasic.Strings.Replace(txtMain.Text, "Dog", "Cute Dog", 1, -1, Constants.vbTextCompare) txtMain.Select(txtMain.Text

我有一个
文本框
,如果我输入“Dog”,我的应用程序应该用“可爱的狗”替换“Dog”。但当我试着运行它时,会生成大量的文本,因为它在“可爱的狗”中找到了“狗”,而它刚刚替换了。代码如下:

txtMain.Text = Microsoft.VisualBasic.Strings.Replace(txtMain.Text, "Dog", "Cute Dog", 1, -1, Constants.vbTextCompare)
            txtMain.Select(txtMain.Text.Length, 0)

这是在
文本更改事件上触发的。

原因是这样替换文本会再次触发TextChanged事件,因为。。。好。。。更改文本框的文本。如果用户更改屏幕上的任何内容,这不是唯一的UI事件

现在这就是为什么你的应用程序会写“可爱的小狗”的原因,然后它会一次又一次地触发事件

您可以引入一个成员变量
\u replacement
,只要替换发生,该变量就被设置为
true
。完成后,将其重置为
false

现在,您只需在代码替换时跳出代码即可:

If (_replacing) Then
    Return
End If

_replacing = True

txtMain.Text = Microsoft.VisualBasic.Strings.Replace(txtMain.Text, "Dog", "Cute Dog", 1, -1, Constants.vbTextCompare)
        txtMain.Select(txtMain.Text.Length, 0)

_replacing = False
这样,用户输入仍会被替换,但替换本身的更改不会再次触发事件。

请参见此