比较两个文档并更改文本颜色

时间:2011-08-01 19:28:52

标签: c# colors richtextbox match

我希望使用RichTextBoxes比较2个文件,并将它们上传到新的RichTextBox中,其中某些文本的绿色相同,不同的文本为红色。

我的意思是:

文档1

C1    147417 111.111 222.222 0 TEXT
U13   IC-123456 1234 9876 360 TEXT
R123 13866 -99.9 123.456 100 TEXT
U24   IC-123456 -14 -50 90 TEXT
............more lines............

文档2

1   U13  IC-123456   SOMETEXT   1.00   EA P C n   Y
                     EC5547,3-UP                 50
1   U24  IC-123456   SOMETEXT   1.00   EA P C n   Y
                     EC5547,3-UP                 50
1   C1  147417   TEXT   2.00   EA P C n   Y
                 0603,EC0303             50
1   R123  138666   MORETEXT   2.00 EA P C n   Y
                                             50
......................more lines..........................

我想在第一个文件中匹配 第1列和第2列 ,看看它们是否存在于第二个文件的任何行中。如果匹配,匹配的项目会将匹配的文本变为绿色,其他所有内容都会变为红色。

  • 无论如何都要这样做?
  • 我怎样才能将第一列与另一个文件中的列进行比较?
  • 是否可以更改RTB中的文本颜色而不是整行?

修改

    private void checkMatchesInGCandBOM()
    {
        // Splits the text up to compare with the other text.
        var combinedSplit = combinedPlacementsRichTextBox.Text.Split('\n');

        string[] splitLines;

        foreach (var line in combinedSplit)
        {
            Match theMatch = Regex.Match(line, @"^.*");

            if (theMatch.Success)
            {
                // Stores the matched value in string output.
                string output = theMatch.Value;

                // Replaces the tabs with spaces.
                output = Regex.Replace(output, @"\s+", " ");
                splitLines = output.Split(' ');

                int pos = 0, pos2 = 0;
                pos = bomRichTextBox.Find(splitLines[0], pos, RichTextBoxFinds.MatchCase);
                pos2 = bomRichTextBox.Find(splitLines[1], pos2, RichTextBoxFinds.MatchCase);

                while (pos != -1)
                {
                    if (bomRichTextBox.SelectedText == splitLines[0] && bomRichTextBox.SelectedText != "")
                    {
                        int my1stPosition = bomRichTextBox.Find(splitLines[1]);
                        bomRichTextBox.SelectionStart = my1stPosition;
                        bomRichTextBox.SelectionLength = splitLines[0].Length;
                        bomRichTextBox.SelectionFont = new System.Drawing.Font("Arial", 8, FontStyle.Underline);
                        bomRichTextBox.SelectionColor = Color.Green;
                    }

                    pos = bomRichTextBox.Find(splitLines[0], pos + 1, RichTextBoxFinds.MatchCase);
                }

                while (pos2 != -1)
                {
                    if (bomRichTextBox.SelectedText == splitLines[1] && bomRichTextBox.SelectedText != "")
                    {
                        int my1stPosition = bomRichTextBox.Find(splitLines[0]);
                        bomRichTextBox.SelectionStart = my1stPosition;
                        bomRichTextBox.SelectionLength = splitLines[1].Length;
                        bomRichTextBox.SelectionFont = new System.Drawing.Font("Arial", 8, FontStyle.Underline);
                        bomRichTextBox.SelectionColor = Color.Blue;
                    }

                    pos2 = bomRichTextBox.Find(splitLines[1], pos2 + 1, RichTextBoxFinds.MatchCase);
                }
            }
        }

但是,这似乎没有正常工作....!

最左边的所有列都应该是 完全 绿色,但由于某种原因,有些是黑色的,有些是黑色和绿色。此外,下一列应该已找到所有内容,并将颜色更改为完成蓝色.. This is what it turned out to look like using the code above.

New screenshot of what happens.

1 个答案:

答案 0 :(得分:1)

您需要创建一个能够逐行提取所需原始值的流程。它看起来不像你的文件是扁平格式而且不使用分隔符,所以提取这些值可能有点棘手......你在评论中提到我们的数据是空格分隔的。在这种情况下,您可以对空格进行拆分,并使用数组的前两个元素创建搜索字符串。

一旦您有办法将这些列与文档的其余部分分开,请循环并调用类似这样的内容:

if (richTextBox2.Find(mystring)>0)
{
    int my1stPosition=richTextBox1.Find(strSearch);
    richTextBox2.SelectionStart=my1stPosition;
    richTextBox2.SelectionLength=strSearch.Length;
    richTextBox2.SelectionFont=fnt;
    richTextBox2.SelectionColor=Color.Green;
} 

(代码主要来自http://social.msdn.microsoft.com/forums/en-US/csharpgeneral/thread/651faf9b-ae32-4c99-b619-d3afd89477e1/

“SelectionColor”基本上告诉RTB更改所选文本的颜色。您正在使用“SelectionStart”和“SelectionLength”自动为您选择文本。

显然将字体参数更改为您想要的任何内容。如果要将文档的其余部分突出显示为红色,则可能需要考虑默认情况下将新RTB设置为红色,因为它听起来好像只用于比较。

以上内容仅适用于第一次出现。如果您希望它突出显示所有出现,您可能想要查看IndexOfAll。有关详情,请参阅此页:http://www.dijksterhuis.org/manipulating-strings-in-csharp-finding-all-occurrences-of-a-string-within-another-string/

IndexOfAll将返回一个数组,其中包含子字符串位于另一个字符串中的每个位置的列表。一旦找到这些,循环遍历数组并使用上面列出的相同代码来更改每个集的颜色。