- PR -

フォーカスを持たないTextBoxにキャレットが表示されてしまう

1
投稿者投稿内容
にー
常連さん
会議室デビュー日: 2006/04/30
投稿数: 35
投稿日時: 2006-08-15 00:34
前回は「未知のクラスのメンバを取得には」で質問させて頂き、皆様に助けて頂きました。その節は、ありがとうございました。今回も行き詰りましたので、皆様のお力を頂きたく投稿いたします。

件名にある通り、現在のプログラムでは、フォーカスが当たっている項目以外にキャレットが表示されてしまう現象が発生しており、これを回避する策が見当たりません。

開発環境: VS2005 Standard
開発言語: C#

画面の構成: textBox1とtextBox2を持つUserControl1を定義し、このUserControl1をForm1上に複数貼り付けます。
画面のイメージ:
+--------------------------+
| |
| [abc ] [ ] |
| [abc ] [ ] |
| [abc ] [ ] |
| [abc ] [ ] |
| |
+--------------------------+

UserControl1のソース:
public partial class UserControl1 : UserControl {
public UserControl1() {
InitializeComponent();
textBox1.Text = "abc"; // テストデータのセット
}

private void textBox2_Enter( object sender, EventArgs e ) {
if ( this.textBox1.Text == string.Empty ) {
((Form1)Parent).NG( this ); // FormにNGを通知
}
}

public void SetErrFocus() {
textBox1.Focus();
}
}

Form1のソース
public partial class Form1 : Form {
public Form1() {
InitializeComponent();
}

public void NG( object sender ) {
if ( ((UserControl1)sender) == userControl12 ) {
userControl11.SetErrFocus();
}
if ( ((UserControl1)sender) == userControl13 ) {
userControl12.SetErrFocus();
}
if ( ((UserControl1)sender) == userControl14 ) {
userControl13.SetErrFocus();
}
}
}

やりたい内容: UserControl1のtextBox2がクリックされた時に、textBox1の中身が空の場合、ひとつ上のUserControl1のtextBox1にフォーカスを当てたい

現象: 実行し、2行目のtextBox1の"abc"を消して、同行のtextBox2をクリックする。すると、キャレットはクリックした2行目のtextBox2にいるが、[tab]キーを押すと1行目のtextBox2にカーソルが登場する。

現象から想像した画面の状態: フォーカスはきちんと1行目のtextBox1に存在するが、キャレットはクリックした項目に居続けている。


回避策をお分かりになる方、いらっしゃればお教え下さい。よろしくお願いします。
にー
常連さん
会議室デビュー日: 2006/04/30
投稿数: 35
投稿日時: 2006-08-15 11:27
画面のイメージがくずれていたので、再投稿します。

UserControl1のイメージ:
[abc  ] [     ]

画面のイメージ:
+-------------------+
|               |
| [abc  ] [     ] |
| [abc  ] [     ] |
| [abc  ] [     ] |
| [abc  ] [     ] |
|               |
+-------------------+

最初に投稿してから、それ以外にもわかった事がありましたので、追記します。


現象A: 一旦、別アプリケーションをアクティブにしてから、当プログラムをアクティブにするとキャレットは1行目のtextBox1に表示される。

それから、次のような実験をしてみると正しく動作しました。

実験: Form1のNG関数を
if ( ((UserControl1)sender) == userControl12 ) {
userControl12.SetErrFocus();
}
if ( ((UserControl1)sender) == userControl13 ) {
userControl13.SetErrFocus();
}
if ( ((UserControl1)sender) == userControl14 ) {
userControl14.SetErrFocus();
}
と、クリックしたUserControl1そのものに対して呼び出してみた。

実験から分かった事: 同一のUserControl1上のフォーカス制御は正しく動作するが、違うUserControl1にはフォーカス制御が正しく行えない。


引き続き、どなたかお助け下さい。よろしくお願いします。
にー
常連さん
会議室デビュー日: 2006/04/30
投稿数: 35
投稿日時: 2006-08-15 15:55
自己解決しました。

UserControl1には、

public void DoFocus() {
FocusDelegate dlg = new FocusDelegate( SetErrFocus );
this.Invoke( dlg );
}

を追加し、

From1のNG関数を
if ( ((UserControl1)sender) == userControl12 ) {
Thread t = new Thread( userControl11.DoFocus );
t.IsBackground = true;
t.Start();
}
のようにしたところ、きれいに動作するようになりました。

1

スキルアップ/キャリアアップ(JOB@IT)