如何比较两个富文本框内容并突出显示已更改的字符?

约翰·斯蒂芬

我用于读取2个richtextbox内容的代码如下:

richTextBox1.Text = File.ReadAllText(tfsVersionFilePath);
richTextBox2.Text = File.ReadAllText(dbVersionFilePath);

现在,我需要比较两个富文本框内容,并突出显示两个富文本框中已更改的字符。目的是as in TFS通过c#应用程序获得差异并突出显示字符(比较文件)。谢谢。

编辑:

int length = (richTextBox1.Text.Length > richTextBox2.Text.Length) ? richTextBox1.Text.Length : richTextBox2.Text.Length;
for (int i = 0; i < length; i++)
{ 
   if (richTextBox1.Text[i] != richTextBox2.Text[i])
   {
      /* and then start your highlight selection here, 
      this is where some difference between the two rich 
      text boxes begins */

      richTextBox1.Select(i, 1); 
      richTextBox1.SelectionColor = System.Drawing.Color.Yellow; 
      richTextBox1.SelectionBackColor = System.Drawing.Color.Red;
   }
}

从调试中我了解到,执行特定行后,richTextBox1Selector或SelectionColororSelectionBackColor方法指向文本光标的位置增加到7个位置如何保持richTextBox1的光标位置

塔瓦

首先感谢ArtyomZzz指出了DiffMatchPatch的重要来源!

这是一段代码,单击按钮后,它将在两个RichTextbox中绘制更改的字符。

首先下载diff-match-patchsource(!请参见下面的更新!)从zip文件中复制“ DiffMatchPatch.cs”并复制到您的项目,并将cs文件包含在您的项目中。还将名称空间添加到您的using子句中。

using DiffMatchPatch;

namespace RTF_diff
{
  public partial class Form1 : Form
  {
    public Form1()
    {
        InitializeComponent();
    }

    // this is the diff object;
    diff_match_patch DIFF = new diff_match_patch();

    // these are the diffs
    List<Diff> diffs;

    // chunks for formatting the two RTBs:
    List<Chunk> chunklist1; 
    List<Chunk> chunklist2;

    // two color lists:
    Color[] colors1 = new Color[3] { Color.LightGreen, Color.LightSalmon, Color.White };
    Color[] colors2 = new Color[3] { Color.LightSalmon, Color.LightGreen, Color.White };


    public struct Chunk
    {
        public int startpos;
        public int length;
        public Color BackColor;
    }


    private void button1_Click(object sender, EventArgs e)
    {
        diffs = DIFF.diff_main(RTB1.Text, RTB2.Text);
        DIFF.diff_cleanupSemanticLossless(diffs);      // <--- see note !

        chunklist1 = collectChunks(RTB1);
        chunklist2 = collectChunks(RTB2);

        paintChunks(RTB1, chunklist1);
        paintChunks(RTB2, chunklist2);

        RTB1.SelectionLength = 0;
        RTB2.SelectionLength = 0;
    }


    List<Chunk> collectChunks(RichTextBox RTB)
    {
        RTB.Text = "";
        List<Chunk> chunkList = new List<Chunk>();
        foreach (Diff d in diffs)
        {
            if (RTB == RTB2 && d.operation == Operation.DELETE) continue;  // **
            if (RTB == RTB1 && d.operation == Operation.INSERT) continue;  // **

            Chunk ch = new Chunk();
            int length = RTB.TextLength;
            RTB.AppendText(d.text);
            ch.startpos = length;
            ch.length = d.text.Length;
            ch.BackColor = RTB == RTB1 ? colors1[(int)d.operation]
                                       : colors2[(int)d.operation];
            chunkList.Add(ch);
        }
        return chunkList;

    }

    void paintChunks(RichTextBox RTB, List<Chunk> theChunks)
    {
        foreach (Chunk ch in theChunks)
        {
            RTB.Select(ch.startpos, ch.length);
            RTB.SelectionBackColor = ch.BackColor;
        }

    }

  }
}

刚开始,我试图将更改后的线条整体上以较浅的颜色进行着色。但是,这需要花费更多的工作,无法完成(为整个行着色,而不是仅对具有内容的部分进行着色),并且一开始就不是问题的一部分。

注意:有四种不同的差异后清除方法。哪一个最合适取决于输入和目的。我建议尝试cleanupSemanticLossless我添加了第三个屏幕截图,显示了此清理的工作方式

这是输出的屏幕截图: 原始输出

和新版本之一: 新的屏幕截图

清理后的屏幕截图 第三张截图

更新:消息来源似乎已经转移。应该有帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

同时突出显示带有两个单独文本框的文本框文本?

来自分类Dev

如何在悬停时更改文本框内容

来自分类Dev

如何在悬停时更改文本框内容

来自分类Dev

如何用CSS突出显示两个文本的区别?

来自分类Dev

在Tkinter文本框中突出显示两个xml文件之间的差异

来自分类Dev

如何打印富文本框的内容

来自分类Dev

用于比较两个工作表并突出显示发生更改的宏

来自分类Dev

PHP比较两个CSV文件并突出显示差异

来自分类Dev

比较两个工作表并突出显示差异

来自分类Dev

比较两个列表并突出显示差异

来自分类Dev

如何比较两个网页的内容?

来自分类Dev

如何在MS Access中比较两个文本框?

来自分类Dev

如何将两个文本框的内容添加在一起并显示在文本块中

来自分类Dev

如何在html中同步两个文本框的内容?

来自分类Dev

如何查找并突出显示两个文本文件之间的差异?

来自分类Dev

如何突出显示(悬停)两个单元格以更改其背景

来自分类Dev

在customMessageBox中显示两个文本框?

来自分类Dev

Python。比较两个文本文件的内容

来自分类Dev

如何使用加载的源从网页获取文本框内容

来自分类Dev

如何突出显示两个形状之间的重叠区域

来自分类Dev

比较两个文本

来自分类Dev

如何减去两个SSRS报告的文本框?

来自分类Dev

如何减去两个SSRS报告的文本框?

来自分类Dev

如何参数化两个以上的文本框

来自分类Dev

比较两个不同工作表中的两列,然后突出显示差异

来自分类Dev

在富文本框中突出显示所有包含“ admin”的行

来自分类Dev

比较两个图像并突出显示第二个图像上的差异

来自分类Dev

Javascript - 如何添加两个文本框的结果并在第三个中显示结果?

来自分类Dev

使用jquery的before方法时,如何仅显示一个包含两个文本框的文本框?

Related 相关文章

  1. 1

    同时突出显示带有两个单独文本框的文本框文本?

  2. 2

    如何在悬停时更改文本框内容

  3. 3

    如何在悬停时更改文本框内容

  4. 4

    如何用CSS突出显示两个文本的区别?

  5. 5

    在Tkinter文本框中突出显示两个xml文件之间的差异

  6. 6

    如何打印富文本框的内容

  7. 7

    用于比较两个工作表并突出显示发生更改的宏

  8. 8

    PHP比较两个CSV文件并突出显示差异

  9. 9

    比较两个工作表并突出显示差异

  10. 10

    比较两个列表并突出显示差异

  11. 11

    如何比较两个网页的内容?

  12. 12

    如何在MS Access中比较两个文本框?

  13. 13

    如何将两个文本框的内容添加在一起并显示在文本块中

  14. 14

    如何在html中同步两个文本框的内容?

  15. 15

    如何查找并突出显示两个文本文件之间的差异?

  16. 16

    如何突出显示(悬停)两个单元格以更改其背景

  17. 17

    在customMessageBox中显示两个文本框?

  18. 18

    Python。比较两个文本文件的内容

  19. 19

    如何使用加载的源从网页获取文本框内容

  20. 20

    如何突出显示两个形状之间的重叠区域

  21. 21

    比较两个文本

  22. 22

    如何减去两个SSRS报告的文本框?

  23. 23

    如何减去两个SSRS报告的文本框?

  24. 24

    如何参数化两个以上的文本框

  25. 25

    比较两个不同工作表中的两列,然后突出显示差异

  26. 26

    在富文本框中突出显示所有包含“ admin”的行

  27. 27

    比较两个图像并突出显示第二个图像上的差异

  28. 28

    Javascript - 如何添加两个文本框的结果并在第三个中显示结果?

  29. 29

    使用jquery的before方法时,如何仅显示一个包含两个文本框的文本框?

热门标签

归档