У меня есть приложение, которое анализирует сообщения данных в трубопроводном формате (HL7), и для этого у него есть DataGridView
, которое синхронизируется с RichTextBox
. В частности, когда вы нажимаете на свойство в DataGridView
, оно переходит на соответствующую позицию в RichTextBox
и наоборот.
В RichTextBox
отключена перенос слов, так что я могу легко сопоставить от строк в редакторе до строк в фактических данных.
Однако в настоящее время мне приходится иметь дело с сообщениями, содержащими дамп Base64 двоичного файла в некоторых его частях, и большой контент делает его богатым текстовое поле обернуть строки в любом случае. Это приводит к ошибкам в вычислениях, и при сопоставлении возвращенной позиции в реальном тексте сообщения я получаю неверные данные, анализ не выполняется, и, как правило, я получаю ArgumentOutOfRangeException
, когда фактическая следующая строка короче, чем нажатая позиция в эта строка.
Это код:
/// <summary>Gets the cursor position as Point, with Y as line number and X as index on that line.</summary>
/// <returns>The cursor position as Point, with Y as line number and X as index on that line</returns>
protected Point GetCursorPosition()
{
Int32 selectionStart = this.rtxtMessage.SelectionStart;
Int32 currentLine = this.rtxtMessage.GetLineFromCharIndex(selectionStart);
Int32 currentPos = selectionStart - this.rtxtMessage.GetFirstCharIndexFromLine(currentLine);
return new Point(currentPos, currentLine);
}
Правильное поведение: ![Correct](https://i.stack.imgur.com/zA7ZB.png)
При этом щелчке функция вернет точку [28, 4].
Неверное поведение в строке с принудительным переносом: ![Incorrect](https://i.stack.imgur.com/NNeWN.png)
При этом щелчке функция вернет точку [6,5], где она должна быть на самом деле [2813,4]. Это заставляет его показывать анализ для следующей строки, и, как уже упоминалось, если щелчок находится в месте в строке, которая находится за концом следующей анализируемой строки, это вызывает ArgumentOutOfRangeException
.
Is Есть ли способ, чтобы компенсировать это принудительное разделение линии? Мне нужно иметь возможность точно определить положение в реальном тексте, чтобы выполнить анализ.
Обратите внимание, что разделение линий не кажется предсказуемым; Я не знаю, какова максимальная длина, после которой он пытается разделить, или символы, по которым он решает, возможно разделение.
Также обратите внимание, две названные RichTextBox
функции, а именно GetLineFromCharIndex
и GetFirstCharIndexFromLine
, правильно соответствуют тому, что фактически отображается на экране ... но то, что показано на экране, является неправильным представлением реальных данных. Фактически, он даже не соответствует выводу собственного свойства RichTextBox
*1034*, которое дает мне содержимое в массиве строк с простым текстом.
Я бы лучше не использовал это свойство .Lines
, хотя, как я заметил, в общем, функции для извлечения текста из поля расширенного текста довольно медленные.