Я также только начал эту книгу, и у меня была точно такая же проблема, хотя код, который вы включили, выглядит намного дальше, чем я.
«Подписание вне диапазона» произошло по двум причинам, во-первых, Рон объясняет, что он только что тестировал, и поэтому вернул жестко запрограммированное значение 3, прежде чем написал функцию CursorLine (), что означает, что вы думаете, по крайней мере, 4? строки текста, которые, как вы говорите, должны быть вставлены, или, возможно, установить текст в это значение перед запуском, также как вы говорите, что они должны иметь возврат каретки, чтобы txtbox.Lines возвращал массив строк.
Вторая причина возникает даже после того, как CursorLine () была реализована, но происходит, только если текстовое поле пусто, поскольку txtbox.Lines возвращает строку [0], но я думаю, что Рон реализует «Пользовательскую историю», которая говорит, что когда текст был введен и пользователь нажимает ввод, поэтому не уверен, исправит ли он это позже, но, вероятно, узнает!
Авторы заявляют, что они изучают C # и покажут, что такое развитие, и все, что является одной из причин, по которым я выбрал изучение этой книги, так как считаю, что это вдохновляет меня на разработку проектов. Я также сначала пытаюсь сделать код, прежде чем посмотреть на его решения, чтобы понять, думаю ли я так же, но, возможно, я знаю C # немного лучше, чем я себе представляю, или я полностью чушь, но я заметил несколько вещей, во-первых, он говорит, что переопределение OnKeyDown () не работает, но я думаю, что он, должно быть, запутался и попытался сделать это в Form вместо того, чтобы наследовать от TextBox и переопределять там.
Это был мой код при чтении «Истории пользователя»:
int curPos = txtbox.SelectionStart;
string Wrd = Environment.NewLine + "<P></P>" + Environment.NewLine;
txtbox.SelectedText = Wrd;
int pl = Environment.NewLine.Length + 3; // "<P>" length is 3
// Put text cursor inbetween <P> tags
txtbox.SelectionStart = curPos + pl;
Он работает не так, как код Рона, но был просто моей интерпретацией «Пользовательской истории», и я не знал, как действовать, если текст выделен или более разбит, если текстовый курсор находится посередине и т. Д.
Также в «Мои приключения» в Экстремальное программирование Приключения в C #
txtbox.GetLineFromCharIndex(txtbox.SelectionStart)
получает позицию строки курсора и не имеет значения, если каретка не возвращается или не изменяется,
насколько я могу судить, я сделал небольшой тест с:
txtbox.GetLineFromCharIndex(txtbox.TextLength)
, который возвращает общее количество строк, которое будет меняться при изменении размера текстового поля.
Используя C #, я всегда ищу решения, которые уже существуют, и люди могут отобрать у меня это, но я думаю, что MS создала отличный язык с отличными компонентами, которые делают то, что вы от них ожидаете, поэтому не нужно заново создавать колесо каждый раз.
Хотя, как я уже сказал, в этой книге первые годы, и, возможно, эти простые решения недостаточно расширяемы, и, возможно, Рон учитывает это, хотя он упомянул, что он просто работает, а потом беспокоится о том, что позже это больше XP.
Уоррен.