- PR -

SelectNextControlとUserControl バグか?

1
投稿者投稿内容
KingBird
会議室デビュー日: 2004/04/14
投稿数: 3
投稿日時: 2004-04-14 19:10
C#でmyCtrlはUserControlを継承したユーザーコントロールのコントロールの場合、
前方に移動できますが、後方に移動できない。解決の方法は誰かがご存知でしょうか?
教えていただきませんか?

this.SelectNextControl(myCtrl, false, true, true, true);
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-04-15 09:53
引用:

KingBirdさんの書き込み (2004-04-14 19:10) より:
C#でmyCtrlはUserControlを継承したユーザーコントロールのコントロールの場合、
前方に移動できますが、後方に移動できない。解決の方法は誰かがご存知でしょうか?
教えていただきませんか?

this.SelectNextControl(myCtrl, false, true, true, true);


 動きましたよ?TabIndexが、myCtrl.TabIndex - 1であるコントロールにフォーカスが移動します。また、第3引数がtrueなので、TabStopがfalseなコントロールには移動しません。

 もしかして、SelectNextControlをコールするごとに、TabIndexの逆順にフォーカスが移動していくことを期待していますか?

※参照先につけていたのを移動
※ややこしいので、1つにしてくださいね
KingBird
会議室デビュー日: 2004/04/14
投稿数: 3
投稿日時: 2004-04-15 10:50
Form、GroupBox、Panelなどに置いたTextBoxの場合、フォーム中でthis.SelectNextControlを使って前方と後方も移動できますが、
UserControlを継承したユーザーコントロールに置いたTextBoxの場合、フォーム中でthis.SelectNextControlを使って、前方に移動できますが、一番先頭以外のTextBoxの場合後方に移動できますが、一番先頭のTextBoxが自分の親の外へ後方に移動できないです、ユーザーコントロール中で回る状態。

例:
UserControl1にtextBox1とtextBox2があります。
フォームForm5にuserControl11、textBox1とtextBox2があります。

Form5.textBox1からEnterキーを押して、Form5.textBox1 → Form5.userControl11.textBox1 → Form5.userControl11.textBox2 → Form5.textBox2 → Form5.textBox1 順で移動できます。OKです。
 
Form5.textBox2からEnterキーとShiftキーを押して、
Form5.textBox2 → Form5.userControl11.textBox2 → Form5.userControl11.textBox1 → Form5.userControl11.textBox2 順で移動します。
Form5.textBox1までフォーカス遷移できません!! NGです。
これはMSのバグでしょうか?何か解決方法がありませんか?


下記のコードを参考してお願いします。

@、ユーザーコントロール
using System;
using System.Collections;
using System.ComponentModel;
using System.Drawing;
using System.Data;
using System.Windows.Forms;

namespace WinAppTest1112
{
/// <summary>
/// UserControl1 の概要の説明です。
/// </summary>
public class UserControl1 : System.Windows.Forms.UserControl
{
private System.Windows.Forms.Label label1;
private System.Windows.Forms.TextBox textBox1;
private System.Windows.Forms.Label label2;
private System.Windows.Forms.TextBox textBox2;
/// <summary>
/// 必要なデザイナ変数です。
/// </summary>
private System.ComponentModel.Container components = null;

public UserControl1()
{
// この呼び出しは、Windows.Forms フォーム デザイナで必要です。
InitializeComponent();

// TODO: InitializeComponent 呼び出しの後に初期化処理を追加します。

}

/// <summary>
/// 使用されているリソースに後処理を実行します。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region コンポーネント デザイナで生成されたコード
/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
/// </summary>
private void InitializeComponent()
{
this.label1 = new System.Windows.Forms.Label();
this.textBox1 = new System.Windows.Forms.TextBox();
this.label2 = new System.Windows.Forms.Label();
this.textBox2 = new System.Windows.Forms.TextBox();
this.SuspendLayout();
//
// label1
//
this.label1.Location = new System.Drawing.Point(8, 16);
this.label1.Name = "label1";
this.label1.Size = new System.Drawing.Size(48, 23);
this.label1.TabIndex = 0;
this.label1.Text = "label1";
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(112, 16);
this.textBox1.Name = "textBox1";
this.textBox1.TabIndex = 2;
this.textBox1.Text = "textBox1";
//
// label2
//
this.label2.Location = new System.Drawing.Point(224, 16);
this.label2.Name = "label2";
this.label2.Size = new System.Drawing.Size(40, 16);
this.label2.TabIndex = 3;
this.label2.Text = "label2";
//
// textBox2
//
this.textBox2.Location = new System.Drawing.Point(272, 16);
this.textBox2.Name = "textBox2";
this.textBox2.TabIndex = 4;
this.textBox2.Text = "textBox2";
//
// UserControl1
//
this.Controls.Add(this.textBox2);
this.Controls.Add(this.label2);
this.Controls.Add(this.textBox1);
this.Controls.Add(this.label1);
this.Name = "UserControl1";
this.Size = new System.Drawing.Size(448, 56);
this.Load += new System.EventHandler(this.UserControl1_Load);
this.ResumeLayout(false);

}
#endregion

private void UserControl1_Load(object sender, System.EventArgs e)
{

}

public void RegistEvent(Form argForm)
{
Form4 myForm = (Form4)argForm;
textBox1.KeyDown += new KeyEventHandler(myForm.TextBox_KeyDown);
textBox2.KeyDown += new KeyEventHandler(myForm.TextBox_KeyDown);

}
}
}

A、フォーム
using System;
using System.Drawing;
using System.Collections;
using System.ComponentModel;
using System.Windows.Forms;

namespace WinAppTest1112
{
/// <summary>
/// Form5 の概要の説明です。
/// </summary>
public class Form5 : System.Windows.Forms.Form
{
private System.Windows.Forms.TextBox textBox1;
private WinAppTest1112.UserControl1 userControl11;
private System.Windows.Forms.TextBox textBox2;
/// <summary>
/// 必要なデザイナ変数です。
/// </summary>
private System.ComponentModel.Container components = null;

public Form5()
{
//
// Windows フォーム デザイナ サポートに必要です。
//
InitializeComponent();

//
// TODO: InitializeComponent 呼び出しの後に、コンストラクタ コードを追加してください。
//
}

/// <summary>
/// 使用されているリソースに後処理を実行します。
/// </summary>
protected override void Dispose( bool disposing )
{
if( disposing )
{
if(components != null)
{
components.Dispose();
}
}
base.Dispose( disposing );
}

#region Windows フォーム デザイナで生成されたコード
/// <summary>
/// デザイナ サポートに必要なメソッドです。このメソッドの内容を
/// コード エディタで変更しないでください。
/// </summary>
private void InitializeComponent()
{
this.textBox1 = new System.Windows.Forms.TextBox();
this.userControl11 = new WinAppTest1112.UserControl1();
this.textBox2 = new System.Windows.Forms.TextBox();
this.SuspendLayout();
//
// textBox1
//
this.textBox1.Location = new System.Drawing.Point(128, 40);
this.textBox1.Name = "textBox1";
this.textBox1.TabIndex = 0;
this.textBox1.Text = "textBox1";
//
// userControl11
//
this.userControl11.BackColor = System.Drawing.Color.LawnGreen;
this.userControl11.Location = new System.Drawing.Point(104, 112);
this.userControl11.Name = "userControl11";
this.userControl11.Size = new System.Drawing.Size(448, 56);
this.userControl11.TabIndex = 1;
//
// textBox2
//
this.textBox2.Location = new System.Drawing.Point(120, 208);
this.textBox2.Name = "textBox2";
this.textBox2.TabIndex = 2;
this.textBox2.Text = "textBox2";
//
// Form5
//
this.AutoScaleBaseSize = new System.Drawing.Size(5, 12);
this.ClientSize = new System.Drawing.Size(664, 310);
this.Controls.Add(this.textBox2);
this.Controls.Add(this.userControl11);
this.Controls.Add(this.textBox1);
this.Name = "Form5";
this.Text = "Form5";
this.Load += new System.EventHandler(this.Form5_Load);
this.ResumeLayout(false);

}
#endregion

private void Form5_Load(object sender, System.EventArgs e)
{
textBox1.KeyDown += new KeyEventHandler(this.TextBox_KeyDown);
textBox2.KeyDown += new KeyEventHandler(this.TextBox_KeyDown);

userControl11.RegistEvent(this);

}

private bool SelectNextControl(Control myCtrl, bool bForward)
{
//bool bForward = true;
bool bTabStopOnly = true;
bool bNested = true;
bool bWrap = true;

return base.SelectNextControl(myCtrl, bForward, bTabStopOnly, bNested, bWrap);
}

public void TextBox_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
{
if (e.Handled == true)
{
return;
}

if (e.KeyCode == Keys.Enter)
{
if ((Control.ModifierKeys & Keys.Shift) == Keys.Shift)
{
//SendKeys.Send("+{TAB}");
this.SelectNextControl((Control)sender, false);
}
else
{
//SendKeys.Send("{TAB}");
this.SelectNextControl((Control)sender, true);
}
}
else if ((e.KeyCode == Keys.Right) || (e.KeyCode == Keys.Down))
{
if (((TextBox)sender).SelectionStart >= ((TextBox)sender).Text.Length)
{
//SendKeys.Send("{TAB}");
this.SelectNextControl((Control)sender, true);
}
}
else if ((e.KeyCode == Keys.Left) || (e.KeyCode == Keys.Up))
{
if (((TextBox)sender).SelectionStart == 0)
{
//SendKeys.Send("+{TAB}");
this.SelectNextControl((Control)sender, false);
}
}
}

}
}
CHN
ぬし
会議室デビュー日: 2002/03/07
投稿数: 382
投稿日時: 2004-04-15 11:54
うわ、これをまじめに読まれる方っておられますかな〜?

MSがよくバグを出しますので、疑われる気持ちはわかりますが、
まず自分を疑うべきです。
コードに誤りがあるとわかったときは、ガックリ来ますよ。

_________________
Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-04-15 12:12
引用:

CHNさんの書き込み (2004-04-15 11:54) より:

MSがよくバグを出しますので、疑われる気持ちはわかりますが、
まず自分を疑うべきです。


 いえ、確かにおかしいです。サンプル作りました。
http://quick-tips.hp.infoseek.co.jp/vs.net/sample/Sample1dash.lzh
↑日が経って消えている場合はご容赦

 プロジェクトファイルなので、ビルドしてください。実行して、「SendInput」ボタンをクリック。
 出てきたフォームの、薄紫の部分(フォームの地)をクリックしてください。フォーカスが順次移ります。
 すみません、移りません。とりあえず、「isForward」と、「isWrap」をチェックしてから、クリックしてください。ステータスバーにフォーカスが移ったコントロールが出ますが、
1.テキストなしのtextBox
2.テキストが「textBox1」であるtextBox
3.1へ戻る
となります。が、ドキュメントからの期待値は、
1.テキストなしのtextBox
2.チェックボックスの類
3.1へ戻る
です。

 反対に、「isForward」をアンチェックすると、チェックボックスの類と、テキストがtextBox2のtextBoxで循環します。何で?
1

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