Определить логическую строку из индекса Char (Winforms TextBox) - PullRequest
6 голосов
/ 04 марта 2010

Если я вызываю textBox.GetLineFromCharIndex(int) в TextBox с WordWrap = true, он возвращает индекс строки, как видит его пользователь (обернутые строки считаются несколькими строками), а не строка в соответствии с разрывами строки.

Line one extends to       // <- word wrapped
here.                     // <- logical line 1, GetLineFromCharIndex returns line 2
This is line two.         // <- logical line 2, GetLineFromCharIndex returns line 3

Кто-нибудь знает решение для поиска логической строки из индекса символов, а не из отображаемой строки?

Ответы [ 4 ]

2 голосов
/ 04 марта 2010

Найдите количество появлений новых строк во всем тексте вплоть до индекса вашего символа.

Возможно, сначала возьмите подстроку текста текстового поля до индекса вашего символа. Используйте Сплит на новых строках и подсчитайте результат.

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

1 голос
/ 04 марта 2010

Я был бы склонен думать, что это решение работает быстрее, чем цикличный поиск новых строк. Вам необходимо « SendMessage » в текстовое поле с сообщением « EM_LINEFROMCHAR »

[DllImport("User32.DLL")]
public static extern int SendMessage(IntPtr hWnd, UInt32 Msg, Int32 wParam, Int32 lParam);

public const int EM_LINEFROMCHAR = 0xC9;

int noLines = SendMessage(TextBox.Handle, EM_LINEFROMCHAR, TextBox.TextLength, 0);

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

Надеюсь, это поможет,

0 голосов
/ 31 августа 2012

Следующее сработало для меня - без видимого удара по производительности

this.WordWrap = false;
int lineIndex = this.GetLineFromCharIndex(this.SelectionStart);
string lineText = this.Lines[lineIndex];
this.WordWrap = true;
0 голосов
/ 07 октября 2011

Вы также можете использовать методы расширения строки с использованием Func, лямбда-выражения или чего-либо еще, если вам не хочется писать цикл -

long lineNumber = textBox.Text.Substring(0, textBox.SelectionStart).LongCount(chr => chr == '\r');

Это вернет нумерацию строк на основе 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...