我正在开发一个针对.Net 4.5.2的WinForms应用程序,并遇到了试图从多行文本框中获取当前插入符号位置的行索引的问题。
当GetLineFromCharIndex()
属性中的所有字符串足够短以适合文本框的宽度时,它只能使用Lines
方法。但是,当其中一个字符串较长时,它会分成两行。这反映在从GetLineFromCharIndex()
返回的索引中,但不在实际的Lines
属性中。然后该索引关闭一个,当我尝试使用它从IndexOutOfRange
访问所需的字符串时,会导致Lines
异常。
当一个字符串太长以至于跨越三行时,索引会被两个关闭,依此类推。
private void monitor_TextBox_KeyDown(object sender, KeyEventArgs e)
{
TextBox rtb = (TextBox)sender;
int lineIndex = rtb.GetLineFromCharIndex(rtb.SelectionStart);
string[] lines = rtb.Lines;
if(e.KeyCode == Keys.Up)
{
e.SuppressKeyPress = true;
string line = lines[lineIndex]; // exception occurs here
...
}
}
当字符串被拆分成多行或类似的东西时,是否会引发事件?
答案 0 :(得分:2)
我认为这里的问题是TextBox.Lines属性将一行视为以'\ n'结尾的字符串。 因此,只有获得新行符号(按下回车键),它才会将其作为新行返回。
当字符串大于TextBoxes宽度为WordWrapping时会发生什么情况,它会自动将Text呈现为新行,但不会添加'\ n'。
你现在可以做的是:
以字符串形式获取TextBox的内容。
循环遍历TextBox的每个字符并将其添加到单独的String中,如果超出TextBoxes宽度,则将其添加到列表中并清除该字符串。 您还需要检查是否有'\ n',然后将String添加到列表中并清除它!
你去了,你有自己的行功能,不会忽略WordWrapping