我也刚刚开始阅读这本书并且遇到了完全相同的问题,尽管您包含的代码看起来比我现在的位置更远。“下标超出范围”的发生有两个原因,首先是 Ron 解释说他只是在测试,因此在他编写 CursorLine() 函数之前返回了一个硬编码值 3,这意味着你我认为至少是 4?正如您所说的需要粘贴的文本行,或者可能在运行之前将文本设置为此值,也正如您所说,它们需要回车以使 txtbox.Lines 返回一个字符串数组。第二个原因即使在实施 CursorLine() 之后也会发生,但仅在文本框为空时发生,因为 txtbox.Lines 返回 string[0] 但我认为 Ron 正在实施一个“用户故事”,它表示当输入文本时用户按下回车,
作者确实声明他们正在学习 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;
它的工作方式与 Ron 的代码不同,但这只是我对“用户故事”的解释,不确定如果选择了文本应该如何操作,或者如果文本光标在中间等是否分割行。
同样在 C# 中的极限编程冒险中的“我的冒险”中
txtbox.GetLineFromCharIndex(txtbox.SelectionStart)
获取光标行位置,如果没有回车或调整大小无关紧要,据我所知,我做了很少的测试:
txtbox.GetLineFromCharIndex(txtbox.TextLength)
它返回总行数,如果您调整文本框的大小,总行数会有所不同。
使用 C# 我总是在寻找已经存在的解决方案,人们可能会为此而选择我,但我认为 MS 已经创建了一种很棒的语言,其中包含很棒的组件,可以做你期望他们做的事情,所以不必重新创建轮子时间。尽管就像我说的那样,这本书还处于早期阶段,也许这些简单的解决方案还不够可扩展,也许 Ron 考虑到了这一点,尽管他确实提到让它工作,然后担心以后更多的是 XP 方式。
沃伦。