0

因此,我编写了一种方法来限制允许在多行文本框中写入的行数(因为这不是 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 事件,但据我所知,这不能完成吗?如果文本超过允许的最大值,另一种解决方案是删除文本行。

还是有可能比我想出的解决方案更好?感谢您的意见。

4

0 回答 0