1

:)私はC#タイピングプログラムを作成しています.ユーザーが間違った文字を入力したときに何も入力できないようにしたい(タイピングカーソルをその位置でフリーズさせたい)、バックスペースを押したときにのみ彼のタイピングを再開します。

ConsoleScreenCursorCoordinates を操作して C++ でこのプログラムを作成しました。textBox.Location を操作して C# で同じことを試みましたが、うまくいきませんでした。

私のプログラムには、2 つの textBoxes、sourceTextBox および TypingTextBox があり、StreamReader を介して textFile から読み取る「text」と呼ばれる文字列変数もあり、このテキスト変数を使用して、そこからの各要素をユーザーの要素と比較します。打ち込んでいる。

私はこれに疲れました:

bool madeMistake = false;
Point CurrentTypingPosition;
string whatIsWrittenBeforeTheMistake = "";

private void TypingTextBox_KeyPress(object sender, KeyPressEventArgs e)
{
     try
     {
       if (!madeMistake)
       {
           if (e.KeyChar == text[typingIndex])
           {
               typingIndex++;
           }
           else if (e.KeyChar == backspace)
           {
               typingIndex--;
           }
           else
           {
               CurrentTypingPosition = TypingTextBox.Location;
               madeMistake = true;
               TypingTextBox.Text += " ";
               TypingTextBox.Location = CurrentTypingPosition;
               whatIsWrittenBeforeTheMistake = TypingTextBox.Text;
           }
       }
       else
       {

           if (e.KeyChar == backspace)
               madeMistake = false;
           else
           {
               TypingTextBox.Text = whatIsWrittenBeforeTheMistake;
               TypingTextBox.Location = CurrentTypingPosition;
           }
        }
     }
     catch (Exception ex)
     {
       MessageBox.Show(ex.Message);
     }
   }
}
4

4 に答える 4

2

これのもう1つのバリエーションHandledは、イベントargsのプロパティを使用することです。これにより、次のKeyPressようになります。

void textBox1_KeyPress(object sender, KeyPressEventArgs e)
{

    if (Char.IsControl(e.KeyChar))
    {
        e.Handled = false;
        return;
    }

    char expectedNext = expected[textBox1.SelectionStart];

    if (expectedNext != e.KeyChar)
    {
        e.Handled = true;
        Console.WriteLine("Incorrect input");
    }
}
于 2012-07-16T17:52:49.883 に答える
2

これを回避するもう 1 つのより堅牢な方法は、TextBox 自体から継承するカスタム TextBox を作成することです。その後、KeyDown (PreviewKeyDown) イベントなどを処理し、キー ストロークごとに何か問題があるかどうかを判断できます。無効な場合は、KeyEventArgs (e.Handled) を true に設定し、それ以上のユーザー入力を防ぐことができます (確認できるバックスペースを除く)。

これにより、Textbox イベントにフックする必要がなくなります。これは、MVVM を使用する場合に望ましいことです。また、非常に細かい制御が必要な場合は、この方法を使用できます。

于 2012-07-16T17:47:16.500 に答える
1

これはうまくいきますか?

    private void TypingTextBox_KeyPress(object sender, KeyPressEventArgs e)
    {
        ...
        if (madeMistake)
            TypingTextBox.ReadOnly = true;
        ...
    }
于 2012-07-16T17:39:13.013 に答える
0

ここで使用している文字配列の代わりに StreamReader オブジェクトを使用するには、これを微調整する必要がありますが、これは機能しますが、バックスペースを使用する必要はありません。

    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {            
        char[] charArr = { 'a', 'b', 'c' };  //spec out what is acceptable here

        foreach (char c in charArr)
        {
            if (e.KeyChar.CompareTo(c) > 0)
            {
                e.Handled = true;                    
            }
            else
            {
                e.Handled = false;
            }
        }
    }
于 2012-07-16T18:12:04.493 に答える