将richtextbox保存为RTF文件后保留文本位置

时间:2014-11-13 11:10:37

标签: c# regex richtextbox rtf

我正在尝试从richtextbox内容创建一些RTF文件(从RTF文件加载) 在通过某些代码打开文件并应用一些更改并将新文件(输出)保存到另一个位置之后。我发现位置文字已经改变,还有字体颜色。请参阅随附的截图以获得更多说明。 输入:

input

输出: output

期望的输出

enter image description here

我想我需要谈谈我从代码中输入的内容:我需要用数据库中的一些变量替换$开头的每个变量:

我使用了这部分代码:

foreach (Match match in Regex.Matches(richTextBox1.Text, "(\\$\\w+)"))
                    {
                        if (match.Groups[1].Value.Substring(1).Equals("Add1"))
                            richTextBox1.Text = richTextBox1.Text.Replace(match.Groups[1].Value, getAdress1(nums_res[j].ToString()));
                        if (match.Groups[1].Value.Substring(1).Equals("Add2"))
                            richTextBox1.Text = richTextBox1.Text.Replace(match.Groups[1].Value, getAdress2(nums_res[j].ToString()));
                        if (match.Groups[1].Value.Substring(1).Equals("Add3"))
                            richTextBox1.Text = richTextBox1.Text.Replace(match.Groups[1].Value, getAdress3(nums_res[j].ToString()));
                        if (match.Groups[1].Value.Substring(1).Equals("Add4"))
                            richTextBox1.Text = richTextBox1.Text.Replace(match.Groups[1].Value, getLand(nums_res[j].ToString()));
                        if (match.Groups[1].Value.Substring(1).Equals("Rechnr"))
                            richTextBox1.Text = richTextBox1.Text.Replace(match.Groups[1].Value, nums_res[j]);
                        if (match.Groups[1].Value.Substring(1).Equals("Datum"))
                            richTextBox1.Text = richTextBox1.Text.Replace(match.Groups[1].Value, getDatum(nums_res[j].ToString()));
                        if (match.Groups[1].Value.Substring(1).Equals("resname"))
                            richTextBox1.Text = richTextBox1.Text.Replace(match.Groups[1].Value, getName1(nums_res[j].ToString()));
                        if (match.Groups[1].Value.Substring(1).Equals("resvorname"))
                            richTextBox1.Text = richTextBox1.Text.Replace(match.Groups[1].Value, getVorname(nums_res[j].ToString()));
                        if (match.Groups[1].Value.Substring(1).Equals("resroom"))
                            richTextBox1.Text = richTextBox1.Text.Replace(match.Groups[1].Value, getZimmer(nums_res[j].ToString()));
                        if (match.Groups[1].Value.Substring(1).Equals("anz"))
                            richTextBox1.Text = richTextBox1.Text.Replace(match.Groups[1].Value, getAnz(nums_res[j].ToString()));
                    }

                    int indexToText = richTextBox1.Find(getAdress1(nums_res[j].ToString()));
                    int endIndex = richTextBox1.Find(getAdress1(nums_res[j].ToString()));
                    if(indexToText > 0 && endIndex > 0)
                        richTextBox1.Select(indexToText, endIndex); richTextBox1.SelectionAlignment = System.Windows.Forms.HorizontalAlignment.Center;

                    int indexToText2 = richTextBox1.Find(getLand(nums_res[j].ToString()));
                    int endIndex2 = richTextBox1.Find(getLand(nums_res[j].ToString()));
                    if (indexToText2 > 0 && endIndex2 > 0)
                        richTextBox1.Select(indexToText2, endIndex2);  richTextBox1.SelectionAlignment = System.Windows.Forms.HorizontalAlignment.Center;
                    richTextBox1.SaveFile("d:\\ryadmogadoroutput" + nums_res[j].ToString());
                    i = i + 1;
                    richTextBox1.Clear();

现在我不会替换所有这些但只是一些我想知道我的输出和所需输出之间的差异。 (你可以看到,我试图将代码中的第一个变量居中)

我想知道是否有一种方法可以在应用改变之后保留文件的原始格式

谢谢

编辑:将属性.text更改为rtf后,改进了输出。还有一些细节要修复:字体颜色,有些替换(我不知道为什么)字符串,请看日期:$ datum enter image description here

编辑:@TaW的解决方案建议: 输出: enter image description here

编译错误: enter image description here

2 个答案:

答案 0 :(得分:0)

我认为您应该通过更改" richTextBox1.Text"将文本格式更改为RTF格式。 to" richTextBox1.RTF"

答案 1 :(得分:0)

在将任何格式应用于RichText后,您必须永远不会直接更改Text。相反,您需要使用SelectedTextCopyPaste以及其他专门方法严格执行Append

所以至少你需要编写一个合适的Replace函数!

也许,运气不错,不在Text上工作,但Rtf属性也会有所帮助,但它可能会与格式化的东西交织在一起......

这是一个可以执行此操作的函数:

void RtfReplace(RichTextBox RTB, Match match, string replace,  ref int offset)
{
    RTB.Select(match.Index + offset, match.Length);
    RTB.SelectedText = replace;
    offset += replace.Length - match.Length;
}

和几个相应的电话

int offset = 0;
foreach (Match match in Regex.Matches(richTextBox1.Text, "(\\$\\w+)"))
{
    if (match.Groups[1].Value.Substring(1).Equals("Add1"))
        RtfReplace(richTextBox1, match, getAdress1(nums_res[j].ToString()), ref offset); 
    if (match.Groups[1].Value.Substring(1).Equals("Add2"))
        RtfReplace(richTextBox1, match, getAdress2(nums_res[j].ToString()), ref offset); 
    //..

更新:由于每次替换都可能会更改替换文本的长度,我们需要根据该差异调整匹配集合中的所有位置(或重复调用整个替换代码,直到找不到更多的匹配。)修复很简单,但是..