2

.NET 2.0 で System.Windows.Forms.RichTextBox コントロールを使用しており、c# を使用しています。

RichTextBox に追加したい文字列の配列がありますが、RTF に新しい段落を作成したくありません。RTF の \par コマンドではなく、\line コマンドで行を分割したい。(入力するだけでなく、Shift + Enterを入力する人をシミュレートしたい。)

RichTextBox.AppendText を取得して \par コマンドの代わりに \line コマンドを生成することができませんでした。そのため、テキストを挿入してから、手動で \line コマンドを RTF 自体に挿入しています。

RTF に挿入した元の文字列が見つからないため、文字列の 1 つに RTF でエスケープされた文字が含まれている場合 (たとえば、単一の終了引用符が \rquote に変換される場合)、これは失敗します。

このソリューションでは、RTF で検索する前に、行内の文字をエスケープする必要があります。

RichTextBox コントロールを取得して、\par コマンドではなく \line コマンドを生成する方法はありますか? または、このソリューションに固執して、RTF エスケープ文字列を検索する必要があります。

これが私の現在のコードです:

string[] lines = textInfo.Lines;

for (int i = 0; i < lines.Length; i++)
{
    rtb.AppendText(lines[i]);

    if (i < lines.Length - 1)
    {
        string rtf = rtb.Rtf;

        int insertedIndex = rtf.LastIndexOf(lines[i]);

        int length = lines[i].Length;

        rtf = rtf.Insert(insertedIndex + length, @"\line");

        rtb.Rtf = rtf;
    }
}
4

1 に答える 1

1

RichTextBoxコントロールは、TextプロパティとRtfプロパティのいずれかを変更すると、それらを自動的に更新します。Textプロパティに追加されたテキストは、自動的にRTFプロパティに更新されます。

いくつかの簡単なテストから、RichTextBoxコントロールは自動的に任意の改行に\ parを挿入するようです(コントロールのEnter、Shift-Enter、およびTextプロパティの\ r \ n \ r \ n Environment.NewLineとAppendText()関数自分自身を制御する)。これがあなたの問題として報告するものです。

コントロールがRTFを生成する方法を変更する方法はないと思います。テキストを追加し、RichTextBoxコントロールにエスケープが必要な文字の変換を処理させてから、すべての\parを\lineに置き換えます。

textInfoがTextBoxであり、その内容を既存のRTFの最後に追加するとします(1行目の+ = for =を置き換えない場合)

rtb.Text += textInfo.Text;

rtb.Rtf = rtb.Rtf.Replace(@"\par", @"\line");

編集:

ドキュメントに1行ずつ行を追加していて、コントロールが\ r \nの\parを生成することがわかっているので、必要な行にいくつかの一意のテキスト(ここでクリエイティブにできます。REPLNを使用)を後置することができます。 \lineで中断します。もちろん、置き換えたい行を特定できる必要があります。これは、質問から推測できます。独自のテキストを追加した後、REPLN\parを\lineに再度置き換えることができます。私が望むほどエレガントではありませんが、それは仕事を成し遂げます。

foreach (string line in textInfo.Lines)
{
   //assuming your condition is that the string contains the substring, "substring"
   rtb.AppendText(line + (line.Contains("substring") ? "REPLN\r\n" : "\r\n"));
}

rtb.Rtf = richTextBox1.Rtf.Replace(@"REPLN\par", @"\line");
于 2009-06-26T02:47:00.267 に答える