2016-12-01 9 views
0

すべてのコントロールを無効にした後、フォーカス矩形とテキストボックスのキャレットが失われてから再び有効になります(vs2012/.NET Framework v4.5)。ボタンのクリックイベントに両方のコントロールを無効にして有効にするには、このコードを使用し、その後、問題を再現するだけのWinFormsアプリケーションプロジェクトを作成し、ボタンやフォームでテキストボックスを追加するにはすべてのコントロールを無効にした後、WinFormsフォームのフォーカスが部分的に失われる

private void button1_Click(object sender, EventArgs e) 
{ 
    button1.Enabled = false; 
    textBox1.Enabled = false; 

    button1.Enabled = true; 
    textBox1.Enabled = true; 
} 

あなたはTab/Shift + Tabを使用して、ボタンを押すまで、テキストボックスとボタンの間を循環します。

その後、フォーカスが部分的に失われます(その奇妙なことです)。 Tab/Shift + Tabと矢印を使用してコントロール間を移動し、Enterキーを押してボタンをアクティブにできますが、テキストボックスには入力することも、スペースキーを使用してボタンを押すこともできません。テキストボックスのキャレットとボタンのフォーカスの四角形は表示されなくなりました。フォーカスを別のアプリケーションに変更してからこのフォームに戻ると、フォーカスの問題が解決されます。

フォーカスを受け取ることができるコントロールを少なくとも1つ無効にしないと、この問題は発生しません。

private void button1_Click(object sender, EventArgs e) 
    { 
     button1.Enabled = false; 
     textBox1.Enabled = false; 

     button1.Enabled = true; 
     textBox1.Enabled = true; 

     this.Enabled = false; 
     this.Enabled = true; 
    } 

私は、タスクの開始時に、より複雑なフォームのすべてのコントロールを無効にしようとしていたので、タスクが再び有効になります。また、フォーカス動作は、次のように、フォームを無効にして再度有効にすることによって復元されUIスレッドをロックせずに、処理中のユーザー入力を防止するために、すべてのコントロールは仕上げ後に制御されます。私はそれがクロススレッド呼び出しに関連していると思ったが、この問題はUIスレッド上で実行されているすべてのコードでも発生することがわかった。

+0

これは完全に正常です。 –

+0

心配しないで、コントロールを有効にした後にthis.Focus()を呼び出すだけで問題が解決されました。 –

答えて

0

この望ましくない動作は、フォームのフォーカス()メソッドを呼び出すことによって固定することができます。

private void button1_Click(object sender, EventArgs e) 
{ 
    button1.Enabled = false; 
    textBox1.Enabled = false; 

    button1.Enabled = true; 
    textBox1.Enabled = true; 

    this.Focus(); 
} 

ACTIVECONTROLは()フォーカスを呼び出した後に変更されていないので、これは私のために非常に適しています。

関連する問題