Копия RichTextBox имеет дополнительный возврат каретки в конце - PullRequest
1 голос
/ 14 декабря 2009

Впервые я изучаю RichTextBox элементы управления в формах C # Windows. Я знаю, что мне нужен этот элемент управления в моем приложении, так как TextBox слишком просто для моих нужд.

У меня есть следующий код:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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

        private void richTextBoxHome_KeyDown(object sender, KeyEventArgs e)
        {
            if (e.KeyValue == (char)(Keys.Return))
            {
                richTextBoxChat.AppendText("Home:" + richTextBoxHome.Text + "\n");
                richTextBoxHome.Clear();
            }
        }
    }
}

На данный момент я просто хочу, чтобы все, что напечатано в одном RichTextBox, отображалось на другом RichTextBox при нажатии Return .

Проблема заключается в том, что каждый раз, когда я нажимаю Return , данные передаются другому элементу управления, но первый элемент управления остается с возвратом каретки перед курсором. Это происходит каждый раз, когда я нажимаю Return . Оба элемента управления принимают многострочный ввод. Как мне заставить это перестать делать это?


Мне бы хотелось, чтобы часть "Home:" была выделена жирным шрифтом.

Я нашел очень мало информации об этом в моих поисках. Вот единственный действительный код, который я мог понять.

rtb1.Rtf = @"{\rtf1\ansi {\b hello} {\i World}}" ; 
richTextBox1.Rtf = @"{\rtf1\ansi This is in \b bold\b0.}";

Я не уверен, как поступить с этой информацией. я просто хочу, чтобы richtextbox отображал «Home:» и «Away:» жирным шрифтом и мог обрабатывать URL-адреса в тексте.

, пожалуйста, посоветуйте, что я должен указать при поиске этой статьи в Google, или любая ссылка, о которой вы могли подумать, будет очень полезна.

Еще раз спасибо за проявленный интерес.


Я добился прогресса в своей проблеме и подумал поделиться.

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

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

        private void richTextBoxHome_KeyPress(object sender, KeyPressEventArgs e)
        {
            if (e.KeyChar == (char)(Keys.Enter))
            {
                e.Handled = true;

                // richTextBoxChat.Rtf = @"{\rtf1 \b Home: \bO}" + @richTextBoxHome;

                // do not delete next 2 lines
                //string test = @"{\rtf1 \b Home: \b0";
                //test = test + richTextBoxHome.Rtf + "}";

                string chatBuffer = richTextBoxChat.Rtf;

                string buffer = @"{\rtf1";
                buffer = buffer + chatBuffer;

                buffer = buffer + @"\b Home:\b0";

                buffer = buffer + richTextBoxHome.Rtf + "}";


               // MessageBox.Show(buffer);
                richTextBoxChat.Rtf = buffer;
                //do not delete the following 2 lines
                //richTextBoxChat.AppendText("Home:" + richTextBoxHome.Text);
                richTextBoxHome.Clear();
            }
        }

    }
}

просто нужно выяснить, как избавиться от новых строк / возвратов каретки в тексте.

любые советы приветствуются.

спасибо.


это не так хорошо тренируется. закончил тем, что использовал ниже.

            this.richTextBoxChat.SelectionFont = new Font(this.richTextBoxChat.Font.FontFamily, this.Font.Size, FontStyle.Bold);
            richTextBoxChat.AppendText("Home: ");
            this.richTextBoxChat.SelectionFont = new Font(this.richTextBoxChat.Font.FontFamily, this.Font.Size, FontStyle.Regular);
            richTextBoxChat.AppendText(richTextBoxHome.Text);
            richTextBoxChat.ScrollToCaret();
            richTextBoxHome.Clear();

Ответы [ 4 ]

10 голосов
/ 14 декабря 2009

Вы можете установить событие для обработки, чтобы предотвратить дальнейшую обработку события возврата keydown

Попробуйте это:

    private void richTextBoxHome_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyValue == (char)(Keys.Return))
        {
            richTextBoxChat.AppendText("Home:" + richTextBoxHome.Text + "\n");
            richTextBoxHome.Clear();

            e.Handled = true;
            e.SuppressKeyPress = true;

        }
    }

Редактировать : добавлено e.SuppressKeyPress = true; Кори Чарльтон указал на это в своем посте.

Редактировать : также, как уже упоминали другие, использовать обработчик событий KeyPress, поэтому, если кто-то удерживает нажатой клавишу ввода / возврата, событие запускается снова и снова. Пример использования следующий:

    private void richTextBoxHome_KeyPress(object sender, KeyPressEventArgs e)
    {
        if (e.KeyChar.Equals((Char) Keys.Enter))
        {
            richTextBoxChat.AppendText("Home:" + richTextBoxHome.Text + "\n");
            richTextBoxHome.Clear();

            e.Handled = true;
        }
    }

Редактировать : Кроме того, есть свойство, которое вы можете установить в RichTextBox, чтобы запретить ввод строк MultiLine в текстовое поле. Это создает проблему при вставке содержимого в несколько строк, оно займет только первую строку.

Для жирных слов: Вы можете изменить SelectionFont RichTextBox, чтобы установить его атрибуты шрифта:

    private readonly Font BoldSelectionFont = new Font("Arial", 9.0f, FontStyle.Bold);
    private readonly Font RegSelectionFont = new Font("Arial", 9.0f, FontStyle.Regular);

...
                richTextBoxChat.SelectionFont = BoldSelectionFont;
                richTextBoxChat.AppendText("Home: ");
                richTextBoxChat.SelectionFont = RegSelectionFont;
                richTextBoxChat.AppendText(richTextBoxHome.Text + "\n");
...
2 голосов
/ 14 декабря 2009

Используйте KeyPress вместо KeyDown и установите e.Handled=true

1 голос
/ 14 декабря 2009

Ручка и нажатие клавиши:

    private void richTextBoxHome_KeyDown(object sender, KeyEventArgs e)
    {
        if (e.KeyValue == (char)(Keys.Return))
        {
            richTextBoxChat.AppendText("Home:" + richTextBoxHome.Text + "\n");
            richTextBoxHome.Clear();

            e.Handled = true;
            e.SuppressKeyPress = true;
        }
    }
1 голос
/ 14 декабря 2009

Чтобы подавить событие KeyDown, напишите e.Handled = true.

Кроме того, лучший способ проверить, какая клавиша была нажата, это написать if (e.KeyCode == Keys.Enter)

...