RichTextBoxで文字列に選択的に下線を付ける方法は?
-
03-07-2019 - |
質問
私のプログラムでは、ボタンをクリックした後、選択したListViewエントリをRichTextBoxにコピーする必要があります。 ListViewには連絡先情報が含まれており、私が達成したい効果は、Oultook(連絡先帳から連絡先を選択する場合)の効果と似ています。この目的を果たすコードの一部は次のようになります。
private void toButton_Click(object sender, EventArgs e)
{
int start = 0;
for (int i = 0; i < contactsListView.SelectedItems.Count; i++)
{
if (contactsTextBox.TextLength != 0) contactsTextBox.Text += "; ";
start = contactsTextBox.TextLength;
contactsTextBox.Text += contactsListView.SelectedItems[i].Text + " " + contactsListView.SelectedItems[i].SubItems[1].Text + " [" + contactsListView.SelectedItems[i].SubItems[2].Text + "]";
contactsTextBox.Select(start, contactsTextBox.TextLength);
contactsTextBox.SelectionFont = new Font(contactsTextBox.SelectionFont, FontStyle.Underline);
contactsTextBox.DeselectAll();
contactsTextBox.SelectionFont = new Font(contactsTextBox.SelectionFont, FontStyle.Regular);
}
}
残念ながらFontStyleはテキスト全体に継承され、ListViewからの入力後に入力したすべてのものにも下線が引かれます。
だから私の質問は-特定のテキストだけに下線を引く方法(私が間違えた場所)?
stackoverflowにも同様のトピックがありますこちらソリューションはリソースの無駄があると述べました。
解決
代わりにこれを試してください:
int start = 0;
for (int i = 0; i < contactsListView.SelectedItems.Count; i++)
{
if (contactsTextBox.TextLength != 0) contactsTextBox.Text += "; ";
start = contactsTextBox.TextLength;
contactsTextBox.Text += contactsListView.SelectedItems[i].Text +" " + contactsListView.SelectedItems[i].SubItems[1].Text + " [" + contactsListView.SelectedItems[i].SubItems[2].Text + "]";
}
this.contactsTextBox.Text += " ";
this.contactsTextBox.SelectionStart = 0;
this.contactsTextBox.SelectionLength = this.contactsTextBox.Text.Length-1;
contactsTextBox.SelectionFont = new Font(contactsTextBox.SelectionFont, FontStyle.Underline);
this.contactsTextBox.SelectionLength = 0;
完全なハックですが、基本的には、すべてのテキストを選択した後、そのすべてを選択しないで(追加の&quot;&quot;を追加する理由です)、選択テキストを設定すると、望ましい効果。
他のヒント
コードの問題は、SelectionFontがそれだけであるということです。つまり、選択のフォントです。選択範囲がない場合、フォントの変更は何もしません。 BFreeが提供したソリューションは、うまくいくようです。これは、WORDでドキュメントを入力する場合と同じことです。下線を引く前に下線付きのセクションの後に文字を追加して、余分な文字が「保存」されるようにします。ドキュメントを継続したときの元のフォーマット。
BFreeの+1ですが、まだ評判がありません:( ...
テキストボックスの最後にテキストを追加する前に、カーソルを最後に置き、フォントを目的のスタイルに設定します。次に、rtb.AppendLine()を呼び出すと、目的の結果が生成されます。
RTBコントロールは、他のワードプロセッサと同じように機能することを覚えておくことが重要です。スタイルを設定し、入力を開始します。その後、そのスタイルを設定した後に入力するものはすべて、corsorの下にある属性を引き継ぎます。
更新: これは完全に機能するようです。
Dim tTexts() As String = {"Dont underline me", "Underline me", "Dont underline me", "Underline me", "Dont underline me", "Underline me", "Dont underline me", "Underline me", "Dont underline me", "Underline me", "Dont underline me", "Underline me"}
Dim tUnderline As Boolean = False
Dim tIndex As Integer = 0
With oRTB
For tIndex = tTexts.GetLowerBound(0) To tTexts.GetUpperBound(0)
If tUnderline Then
.SelectionStart = .Text.Length
.SelectionFont = New Font("Arial", 12, FontStyle.Underline)
Else
.SelectionStart = .Text.Length
.SelectionFont = New Font("Arial", 12, FontStyle.Regular)
End If
.AppendText(tTexts(tIndex))
tUnderline = Not tUnderline
Next
End With