Обнаружение вставки в RichTextBox - PullRequest
1 голос
/ 09 июля 2011

Есть ли какой-нибудь способ, которым я могу обнаружить или вызвать событие, когда текст вставляется в RichTextBox?Или, может быть, уже есть какое-то событие, которое срабатывает при вставке текста?Это Winforms C #, кстати.

Ответы [ 4 ]

5 голосов
/ 10 июля 2011

Поскольку не все люди могут использовать Ctrl + V, а также потому, что есть другие способы получения текста в текстовое поле (например, перетаскивание), я пошел другим путем, которым я поделюсь здесь, если кто-то еще ищет для решения.

Я создал поле в своем классе:

int _lastPosition = 0;

и в событие TextChanged () я добавил следующее:

if (SelectionStart - _lastPosition > 2)
{
    // Text was pasted into text box
}
_lastPosition = SelectionStart;

Я исходил из того, что если в текстовое поле было введено более 2 символов одновременно, то текст должен быть вставлен, потому что как еще кто-то может вводить более 2 символов одновременно? Так или иначе, это сработало для меня. Спасибо всем, кто пытался помочь.

0 голосов
/ 01 марта 2017

Вот еще один аналогичный подход для обнаружения того, что произошло вырезание или вставка, который изменяет количество символов в поле (он не определяет, было ли вставлено то же количество символов, которое было выделено): Сначала создайте член уровня класса для хранения текущей длины

private int _LastTextLength = 0; 

Теперь отметьте длину, когда пользователь вводит поле:

private void txtNoteDetails_Enter(object sender, EventArgs e)
{
    _LastTextLength = txtNoteDetails.Text.Length;
}

Затем используйте событие TextChanged:

private void txtNoteDetails_TextChanged(object sender, EventArgs e)
{
    if (Math.Abs(txtNoteDetails.Text.Length - _LastTextLength) > 2)
    {
        //Do your thing
    }
}
0 голосов
/ 14 августа 2012

Ответ Icemanminds не работает должным образом, он показывает, когда вы вставили, но имеет побочные эффекты.

Вы также введете блок if в тексте, измененный, если вы сделаете это, с пустым текстовым полем 1. вставьте как минимум две строки текста 2. подняться на верхнюю строку с помощью клавиш со стрелками, нажмите пробел, затем возврат 3. с помощью клавиш со стрелками возвращается к нижней строке и нажмите Enter Теперь вам сообщают о пасте, когда этого не произошло.

Редактировать: вот решение проблемы

Код:

    protected override void OnSelectionChanged(EventArgs e)
    {
        base.OnSelectionChanged(e);
        int cavetOffset = SelectionStart - m_nLastCavetPos;
        int sizeOffset = Text.Length - m_nLastKnownSize;
        if (sizeOffset > 0)
        {
            if (sizeOffset == 1)
                Console.WriteLine("Typed \"" + (Text.Substring(SelectionStart - cavetOffset, sizeOffset)) + "\" At Position " + (SelectionStart - cavetOffset));
            else if (sizeOffset > 1)
                Console.WriteLine("Pasted \"" + (Text.Substring(SelectionStart - cavetOffset, sizeOffset)) + "\" At Position " + (SelectionStart - cavetOffset));
        }
        else if (sizeOffset == 0)
        {
            Console.WriteLine("Moved Caret to " + SelectionStart + " From " + m_nLastCavetPos);
        }
        else
        {
            if (sizeOffset == -1)
                Console.WriteLine("Backspaced at " + (SelectionStart - cavetOffset));
            if (sizeOffset < -1)
                Console.WriteLine("HiliteDelete at " + ((SelectionStart - cavetOffset)+-sizeOffset) + " deleted " + (-sizeOffset) + " characters");
        }
        m_nLastKnownSize = Text.Length;
        m_nLastCavetPos = SelectionStart;
    }
0 голосов
/ 09 июля 2011

Я ни в коем случае не эксперт по C #, фактически прошло 3 года с тех пор, как я коснулся языка! Однако вы можете использовать метод ProcessCmdKey для прослушивания CTRL + V.

http://msdn.microsoft.com/en-us/library/system.windows.forms.control.processcmdkey(v=vs.71).aspx

...