Событие RichTextBox при наборе текста - PullRequest
2 голосов
/ 19 апреля 2011

Я хочу получать каждое слово отдельно одно за другим в строковой переменной, когда я набираю что-то в RichTextBox. Какое событие будет запущено и как я его получу?

Ответы [ 4 ]

3 голосов
/ 19 апреля 2011

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

// subscribe to event elsewhere in your class
this.myRichTextBox.TextChanged += this.TextChangedHandler;

// ...

private void TextChangedHandler(object sender, EventArgs e)
{
    string currentText = this.myRichTextBox.Text;
    var words = currentText.Split(new [] { ' ' }, 
                                  StringSplitOptions.RemoveEmptyEntries);
    // whatever else you want to do with words here
}

Edit:

Если вы хотите получить набранное слово, вы можете просто использовать IEnumerable.LastOrDefault :

var words = currentText.Split(new [] { ' ' }, 
                              StringSplitOptions.RemoveEmptyEntries);
string currentlyTyped = words.LastOrDefault();

Если вас беспокоят проблемы производительности / взаимодействия с пользователем при разделении слов при каждом вводе текста, вы можете просто проанализировать последний символ и добавить его к некоторому currentWord:

// in your event handler
char newestChar = this.myRichTextBox.Text.LastOrDefault();
if (char.IsWhiteSpace(newestChar) || char.IsControl(newestChar))
{
    this.currentWord = ""; // entered whitespace, reset current
}
else 
{
    this.currentWord = currentWord + newestChar;
}
0 голосов
/ 19 апреля 2011

Даже если для этого можно использовать событие TextChanged, я думаю, что производительность будет ужасной, если у вас уже есть заполненный текстовый блок и просто введите другой символ.усилия.Возможно, перезапустите таймер для каждого события TextChanged (1000 мс), чтобы пользователь не перехватил ввод быстрого кода и начал подсчет слов только при запуске события таймера.и подсчитать алгоритм в фоновом режиме и, возможно, (или нет) отменить подсчет, если пользователь собирается снова ввести что-то в поле.

Обновить

Хорошо, вот пример реализации:

using System;
using System.ComponentModel;
using System.Windows.Forms;

namespace WindowsFormsApplication
{
    public partial class FormMain : Form
    {
        public FormMain()
        {
            InitializeComponent();
        }

        private void textBox1_TextChanged(object sender, EventArgs e)
        {
            RestartTimer();
        }

        private void backgroundWorker1_DoWork(object sender, DoWorkEventArgs e)
        {
            var textToAnalyze = textBox1.Text;

            if (e.Cancel)
            {
                // ToDo: if we have a more complex algorithm check this
                //       variable regulary to abort your count algorithm.
            }

            var words = textToAnalyze.Split();
            e.Result = words.Length;
        }

        private void backgroundWorker1_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
        {
            if (e.Cancelled
              || e.Error != null)
            {
                // ToDo: Something bad happened and no results are available.
            }

            var count = e.Result as int?;

            if (count != null)
            {
                var message = String.Format("We found {0} words in the text.", count.Value);
                MessageBox.Show(message);
            }
        }

        private void timer1_Tick(object sender, EventArgs e)
        {
            if (backgroundWorker1.IsBusy)
            {
                // ToDo: If we already run, should we let it run or restart it?
                return;
            }

            timer1.Stop();
            backgroundWorker1.RunWorkerAsync();

        }

        private void RestartTimer()
        {
            if (backgroundWorker1.IsBusy)
            {
                // If BackgroundWorker should stop it's counting
                backgroundWorker1.CancelAsync();
            }

            timer1.Stop();
            timer1.Start();
        }
    }
}
0 голосов
/ 19 апреля 2011

хорошо, это то, что я сделал бы в событии TextChanged Richtextbox

string[] x = RichTextBox1.Text.Split(new char[]{ ' ' });

Переберите переменную (массив sting) x и разместите результаты там, где вам это нужно. (например, в виде списка, ярлыка и т. д.)

0 голосов
/ 19 апреля 2011

Просто TextXhanged Событие будет вызываться всякий раз, когда вы что-то печатаете в RichTextBox (сюрприз!)

...