- - PR -
SelectNextControlとUserControl バグか?
1
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2004-04-14 19:10
C#でmyCtrlはUserControlを継承したユーザーコントロールのコントロールの場合、
前方に移動できますが、後方に移動できない。解決の方法は誰かがご存知でしょうか? 教えていただきませんか? this.SelectNextControl(myCtrl, false, true, true, true); | ||||
|
投稿日時: 2004-04-15 09:53
動きましたよ?TabIndexが、myCtrl.TabIndex - 1であるコントロールにフォーカスが移動します。また、第3引数がtrueなので、TabStopがfalseなコントロールには移動しません。 もしかして、SelectNextControlをコールするごとに、TabIndexの逆順にフォーカスが移動していくことを期待していますか? ※参照先につけていたのを移動 ※ややこしいので、1つにしてくださいね | ||||
|
投稿日時: 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); } } } } } | ||||
|
投稿日時: 2004-04-15 11:54
うわ、これをまじめに読まれる方っておられますかな〜?
MSがよくバグを出しますので、疑われる気持ちはわかりますが、 まず自分を疑うべきです。 コードに誤りがあるとわかったときは、ガックリ来ますよ。 _________________ | ||||
|
投稿日時: 2004-04-15 12:12
いえ、確かにおかしいです。サンプル作りました。 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
