【问题标题】:Application.Selection.Find.Execute() operates with text even outside the selectionApplication.Selection.Find.Execute() 对文本进行操作,即使在选择之外
【发布时间】:2021-07-10 09:11:22
【问题描述】:

我正在开发 MS Word 插件,它旨在将选定的文本从拉丁语转换为西里尔语。方法如下:

public void L_to_C_Text_Convert()
    {
        //
        string[] latin =
            {"a","b","v","g","dž","d","đ","e","ž","z","i","k","lj","l","m","nj","n","j","o","p","r","s","t","ć","u","f","h","c","č","š"};
        //
        string[] cyrillic =
            {"а","б","в","г","џ","д","ђ","е","ж","з","и","к","љ","л","м","њ","н","ј","о","п","р","с","т","ћ","у","ф","х","ц","ч","ш"};
        //
        for (int i = 0; i < 30; i++)
        {
            Application.Selection.Find.ClearFormatting();
            Application.Selection.Find.Text = latin[i];
            //
            Application.Selection.Find.Replacement.ClearFormatting();
            Application.Selection.Find.Replacement.Text = cyrillic[i];
            //
            object replaceAll = Word.WdReplace.wdReplaceAll;
            //
            Application.Selection.Find.Execute(ref missing, ref missing, ref missing, ref missing, ref missing,
                                    ref missing, ref missing, ref missing, ref missing, ref missing,
                                    ref replaceAll, ref missing, ref missing, ref missing, ref missing);
        }
    }

它大部分工作正常,但有时它表现得很奇怪。当只选择一个字母时,程序会替换所选内容之外的所有字母(如所选字母)以及所选内容中的确切字母,当然,我不想要或不需要什么。有时即使在选择范围之外使用随机(似乎是随机的)字母也会这样做。

调试时,我在 Watch 上有 Application.Selection.Text,这让我更加不知道出了什么问题。

为什么它会这样工作,我应该怎么做才能防止在选择之外进行替换?

【问题讨论】:

    标签: c# replace ms-word selection word-addins


    【解决方案1】:

    如果您搜索的值与当前搜索范围完全匹配,Word 将假定它是刚刚找到它的结果(找到匹配时,搜索范围更改为匹配的范围),因此将将搜索范围动态更改为当前搜索范围之前或之后(取决于设置)的内容。如果没有这种行为,每次搜索下一个匹配项时,搜索范围都不会改变,因为它已经完全包含了您要搜索的值。

    当您执行查找和替换时,情况相同。如果您要搜索的值与当前搜索范围完全匹配,Word 将更改搜索范围,如果 Replace 属性的值为 2 (WdReplaceAll),则当前搜索范围包含在新的搜索范围中。

    考虑到这一点,为了防止在当前选择恰好是您正在搜索的值之一的情况下替换选择之外,您可以在 For 循环的开头添加一些代码来检查是否当前选择等于latin[i],如果等于latin[i],则将值替换为cyrillic[i],然后退出For循环。

    【讨论】:

      猜你喜欢
      • 2011-12-16
      • 1970-01-01
      • 2014-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-04-15
      • 1970-01-01
      • 2010-10-25
      相关资源
      最近更新 更多