2011-08-15 6 views
12

私はWinForms RichTextBoxを使用しています。リッチテキストボックスがフォーム上にある場合、\r\n\nに変換されます。ここにテストがあります:RichTextBox改行の変換?

私は2つのリッチテキストボックスを持っています。一つは、フォーム上に配置されrichTextBox1、次のとおりです。

this.richTextBox1 = new System.Windows.Forms.RichTextBox(); 
    this.SuspendLayout(); 
    // 
    // richTextBox1 
    // 
    this.richTextBox1.Location = new System.Drawing.Point(37, 12); 
    this.richTextBox1.Name = "richTextBox1"; 
    this.richTextBox1.Size = new System.Drawing.Size(100, 96); 
    this.richTextBox1.TabIndex = 0; 
    this.richTextBox1.Text = ""; 

他のは、私がその場で作成rtb、です。

var rtb = new RichTextBox(); 
    string enl = "Cheese" + Environment.NewLine + "Whiz"; 
    rtb.Text = enl; 
    string ncr = rtb.Text; 
    MessageBox.Show(string.Format("{0}{1}{2}{3}---{4}{5}{6}{7}{8}{9}", 
           enl.Replace("\n", "\\n").Replace("\r", "\\r"), Environment.NewLine, 
           ncr.Replace("\n", "\\n").Replace("\r", "\\r"), Environment.NewLine, 
           Environment.NewLine, 
           (enl == ncr), Environment.NewLine, 
           enl.Contains(Environment.NewLine), Environment.NewLine, 
           ncr.Contains(Environment.NewLine))); 
    /* 
    Cheese\r\nWhiz 
    Cheese\r\nWhiz 
    --- 
    True 
    True 
    True 
    */ 
    richTextBox1.Text = enl; 
    string ncr2 = richTextBox1.Text; 
    MessageBox.Show(string.Format("{0}{1}{2}{3}---{4}{5}{6}{7}{8}{9}", 
           enl.Replace("\n", "\\n").Replace("\r", "\\r"), Environment.NewLine, 
           ncr2.Replace("\n", "\\n").Replace("\r", "\\r"), Environment.NewLine, 
           Environment.NewLine, 
           (enl == ncr2), Environment.NewLine, 
           enl.Contains(Environment.NewLine), Environment.NewLine, 
           ncr2.Contains(Environment.NewLine))); 
    /* 
    Cheese\r\nWhiz 
    Cheese\nWhiz 
    --- 
    False 
    True 
    False 
    */ 

リッチテキストボックスがいくつかの奇妙な挙動を示すことのようです:私は(フォームのLoadイベントで)このコードを実行すると。私が作成したボックスに\r\nを含むテキストを置くと、それは同じままです(まだ\r\nが入っています)。しかし、\r\nを含むテキストをフォームのボックスに入れると、\r\n\nに変わります。

私の質問:この動作の理由はありますか(\r\n - >\n)?この動作はどこかに記録されていますか?私はそれが常にこの方法であると思うことができますか?

私はここに掲載する場合は、私は別のプロジェクトで私のいずれかの形式で持ってきたので、私はこの問題に関して、任意の入力をいただければと思い、問題の底に取得で私の試みです。

+1

しかし、私はちょうどそれを回避ハッキング、前にこれを見て覚えている: - /答え – GreyCloud

答えて

7

RichTextBox.Textプロパティは、RichTextBox.Rtfプロパティで指定されたRtfフォーマットコードに従って、割り当てられた文字列をrtfドキュメントに変換しています。 'rtb'インスタンスは初期化されていないので、 'Rtf'フォーマットコードは空であり、入力をエコーバックしているだけです。 'rtb'が初期化された後、それは 'richTextBox1'と同じ(そして正しい)振る舞いである空のrtfドキュメント(フォーマットコード付き)を含んでいます。

結果:

preinit rtb.Rtf : '' 
postinit rtb.Rtf : '"{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fnil\\fcharset0 Microsoft Sans Serif;}}\r\n\\viewkind4\\uc1\\pard\\f0\\fs17\\par\r\n}\r\n"' 
richTextBox1.Rtf : '"{\\rtf1\\ansi\\ansicpg1252\\deff0\\deflang1033{\\fonttbl{\\f0\\fnil\\fcharset0 Microsoft Sans Serif;}}\r\n\\viewkind4\\uc1\\pard\\f0\\fs17\\par\r\n}\r\n"' 
richtextBox1.Rtf with cheese : '"{\\rtf1\\ansi\\deff0{\\fonttbl{\\f0\\fnil\\fcharset0 Microsoft Sans Serif;}}\r\n\\viewkind4\\uc1\\pard\\lang1033\\f0\\fs17 Cheese\\par\r\nWhiz\\par\r\n}\r\n"' 

はコード:

void Form1_Load(object sender, EventArgs e) 
{ 
    TestIt(); 
} 
public void TestIt() 
{ 
    string enl = "Cheese" + Environment.NewLine + "Whiz"; 

    RichTextBox rtb = new RichTextBox(); 
    MessageBox.Show("preinit rtb.Rtf : '" + rtb.Rtf + "'"); 
    this.Controls.Add(rtb); 
    MessageBox.Show("postinit rtb.Rtf : '" + rtb.Rtf + "'"); 
    MessageBox.Show("richTextBox1.Rtf : '" + richTextBox1.Rtf + "'"); 

    rtb.Text = enl; 
    string ncr = rtb.Text; 
    MessageBox.Show(string.Format("rtb: {0}{1}{2}{3}---{4}{5}{6}{7}{8}{9}", 
            enl.Replace("\n", "\\n").Replace("\r", "\\r"), Environment.NewLine, 
            ncr.Replace("\n", "\\n").Replace("\r", "\\r"), Environment.NewLine, 
            Environment.NewLine, 
            (enl == ncr), Environment.NewLine, 
            enl.Contains(Environment.NewLine), Environment.NewLine, 
            ncr.Contains(Environment.NewLine))); 
    /* 
    Cheese\r\nWhiz 
    Cheese\nWhiz 
    --- 
    False 
    True 
    False 
    */ 
    richTextBox1.Text = enl; 
    MessageBox.Show("richTextBox1.Rtf with cheese : '" + richTextBox1.Rtf + "'"); 
    string ncr2 = richTextBox1.Text; 
    MessageBox.Show(string.Format("richTextBox1: {0}{1}{2}{3}---{4}{5}{6}{7}{8}{9}", 
            enl.Replace("\n", "\\n").Replace("\r", "\\r"), Environment.NewLine, 
            ncr2.Replace("\n", "\\n").Replace("\r", "\\r"), Environment.NewLine, 
            Environment.NewLine, 
            (enl == ncr2), Environment.NewLine, 
            enl.Contains(Environment.NewLine), Environment.NewLine, 
            ncr2.Contains(Environment.NewLine))); 
    /* 
    Cheese\r\nWhiz 
    Cheese\nWhiz 
    --- 
    False 
    True 
    False 
    */ 
} 
+3

を楽しみにしていますそして、改行を '\ N 'であることをRTF仕様の一部ですか? – NickAldwin

+4

私は、rtfファイルの文字セットが通常 '\ ansi'であることと、ゲッターで使用されるUnicodeのコードページ '\ ansicpg1252'とが関係していると考えています。入力テキストの改行は、rtf仕様に従ってrtf段落改行 '\ par'としてコード化され、unicode rtfコードページによって改行として再発行されます。 – mark

+0

上記のコードに段落のエンコードを示すMessageBoxを追加しました。 – mark

5
var rtb = new RichTextBox(); 
    string enl = "Cheese" + Environment.NewLine + "Whiz"; 
    rtb.Text = enl; 

これは、Textプロパティの動作方法の副作用です。 Control.Textにキャッシュされているため、実際のネイティブWindowsコントロールは作成されるまで更新されません。問題は、あなたのrtbで決して起こらなかったことです。フォームに追加していないので、ネイティブコントロールが作成されませんでした。一般的な.NETのレイジーリソース割り当てパターンしたがって、コントロールからの値ではなく、キャッシュされた値を読み取っています。これを確認するには

、作成するコントロールを強制的にコードを変更:

 var rtb = new RichTextBox(); 
     rtb.CreateControl(); 
     string enl = "Cheese" + Environment.NewLine + "Whiz"; 
     rtb.Text = enl; 

そして、あなたが今では\ rをする\ nを\ nをするために翻訳されて表示されます。コントロールをDispose()することを忘れないでください。

+4

これは意味がありますが、なぜ\ r \ nが\ nに変更されたのか、もっと気になりました。 – NickAldwin

+4

これはコントロールの仕組みです。 RTBには多くのマイレージがあります。 –

関連する問題