因此,我编写了一种方法来限制允许在多行文本框中写入的行数(因为这不是 Microsoft 提供的属性)。该方法适用于所有情况,除非发生自动换行事件(键入单个字符或从剪贴板粘贴文本时)。我现在拥有的代码:
protected void limitLineNumbers(object sender, KeyPressEventArgs e, UInt16 numberOfLines)
{
int[] specialChars = { 1, 3, 8, 22, 24, 26 }; // ctrl+a, ctrl+c, backspace, ctrl+v, ctrl+x, ctrl+z
bool found = false;
string lastPressedChar = "";
TextBox temp = (TextBox)sender;
foreach (int i in specialChars)
{
if (i == (int)e.KeyChar)
found = true;
}
if (!found)
lastPressedChar = e.KeyChar.ToString(); // Only add if there is a "real" char
int currentLine = temp.GetLineFromCharIndex(temp.SelectionStart) + 1;
int totalNumberOfLines = temp.GetLineFromCharIndex(temp.TextLength) + 1;
if ((int)e.KeyChar == 1)
temp.SelectAll();
// Paste text from clipboard (ctrl+v)
else if ((int)e.KeyChar == 22)
{
string clipboardData = Clipboard.GetText();
int lineCountCopiedText = 0;
foreach (char c in clipboardData)
{
if (c.Equals("\n"))
++lineCountCopiedText;
}
if ((currentLine > numberOfLines || (totalNumberOfLines + lineCountCopiedText) > numberOfLines))
e.Handled = true;
}
// Carrige return (enter)
else if ((int)e.KeyChar == 13)
{
if ((currentLine + 1) > numberOfLines || (totalNumberOfLines + 1) > numberOfLines)
e.Handled = true;
}
// Disallow
else if ((currentLine > numberOfLines) || (totalNumberOfLines > numberOfLines))
e.Handled = true;
}
那么,你们有什么想法可以让这个方法更完整吗?最好的解决方案是捕捉 wordwrap 事件,但据我所知,这不能完成吗?如果文本超过允许的最大值,另一种解决方案是删除文本行。
还是有可能比我想出的解决方案更好?感谢您的意见。