Удалить конечный символ в текстовом поле без перезаписи всех данных

Я пишу программу для связи через последовательный порт. Все отправленные данные зеркалируются. Все работает нормально, кроме обратных пробелов. Когда я нажимаю кнопку Backspace, единственный способ удалить последний символ в текстовом поле - это использовать функцию mid, а затем перезаписать текущие данные новыми данными. Когда много данных находится внутри richtextbox, оно начинает мерцать. Я пробовал использовать функцию richtextbox.text.remove, но получаю эту ошибку. «Индекс и счетчик должны относиться к определенному месту в строке. Имя параметра: счетчик»

RichTextBox1.Text.Remove(RichTextBox1.TextLength, 1)

Я попытался ввести в функцию какое-то число, которое не вызывает ошибки, но данные из richtextbox не удаляются.

Вот код, который передает данные

   KeyCharString = e.KeyChar 'stores key being pressed into KeyCharString
    Try
        SerialPort1.Write(KeyCharString) 'tx data for key being pressed
    Catch ex As Exception
        MsgBox(ex.Message) 'Displays error if serialport1 cannot be written to
    End Try

    If Asc(KeyCharString) = 8 Then 'If char is a backspace remove precious character and exit sub
        RichTextBox1.Text = RichTextBox1.Text.Remove(RichTextBox1.TextLength, 1)
        'RichTextBox1.Text = Mid(RichTextBox1.Text, 1, RichTextBox1.TextLength - 1)'Old code used to remove the character.  Causes the richtextbox to flicker when rewriting the data
        Exit Sub
    End If

Это код, который получает данные

    receivedString = SerialPort1.ReadExisting.ToString

    If Asc(receivedString) = 8 Then 'deletes the received data if it is a backspace
        receivedString = ""
        Exit Sub
    End If
    RichTextBox1.AppendText(receivedString) 'adds new data to the richtextbox

Есть ли способ удалить 1 символ из richtextbox без перезаписи всех данных внутри него? Кроме того, richtextbox доступен только для чтения.


person Lagg Master    schedule 03.07.2012    source источник


Ответы (1)


Используемый вами метод String.Remove возвращает String, он ничего не делает с исходной строкой.

из ссылки MSDN:

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

Попробуйте это, но я не уверен в мерцании:

RichTextBox1.Text = RichTextBox1.Text.Remove(RichTextBox1.TextLength - 1, 1)

или что-то вроде этого:

RichTextBox1.SelectionStart = RichTextBox1.TextLength - 1
RichTextBox1.SelectionLength = 1
RichTextBox1.ReadOnly = False
RichTextBox1.SelectedText = ""
RichTextBox1.ReadOnly = True
person Mark Hall    schedule 03.07.2012
comment
Марк, я полностью пропустил задание в своем решении, поэтому удалил его. Ваш второй вариант - это то, что вам нужно. - person Holger Brandt; 04.07.2012
comment
Второй код просто выделяет символ, который будет удален, и не удаляет его. Первый код удаляет его, но вызывает мерцание. - person Lagg Master; 04.07.2012
comment
@LaggMaster, он правильно работает на моем компьютере, вы устанавливаете SelectedText на - person Mark Hall; 04.07.2012
comment
Я устанавливаю для SelectedText значение. Когда я загружаю отладчик и просматриваю код, он не устанавливает для выделенного текста значение. Я попытался принудительно включить selectedText в меню часов, и когда я нажимаю клавишу ввода, он возвращает его к старому символу. - person Lagg Master; 04.07.2012
comment
@LaggMaster Я вижу, что происходит, это свойство Readonly, см. Мои правки. - person Mark Hall; 04.07.2012
comment
Я решил, что установка только для чтения на false, тогда true вызовет мерцание, но это не так. Что-то странное, если я установлю для него выделенный текст, он заменит существующий символ, но приведет к тому, что длина строки будет такой же. Таким образом, вы можете удалить только 1 символ. Код новый работает, спасибо. - person Lagg Master; 04.07.2012