0

そこで、複数行のテキスト ボックスに書き込むことができる行数を制限する方法を作成しました (これは Microsoft が提供するプロパティではないため)。このメソッドは、wordwrap イベントが発生する場合 (単一の文字を入力する場合、またはクリップボードからテキストを貼り付ける場合) を除いて、すべての場合に機能します。私が今持っているコード:

    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 イベントをキャッチすることですが、私が理解できる限り、これは実行できませんか? もう 1 つの解決策は、許容される最大数を超えた場合、テキスト行を削除することです。

それとも、私が思いついたものよりも良い解決策はありますか? ご意見をお待ちしております。

4

0 に答える 0