質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Q&A

解決済

1回答

4415閲覧

TextBox[A]からTextBox[B]に移動し、[B]の方を最前面表示する。

kaisen

総合スコア28

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

0グッド

1クリップ

投稿2017/12/19 09:53

編集2017/12/19 11:26

###前提・実現したいこと
こんばんは。
C#でフォームアプリを作成しています。

実現したいことは、

TextBox[i]でテキスト入力中にshift+Enterキーを入力することで、
TextBox[i-1]に移動する。

さらに、その際、
TextBox[i-1]をフォーム内のコントロールの最前面に表示する。

というような動作の
フォームアプリを作ることです。

###発生している問題
121: if (e.KeyCode == Keys.Enter)
122: {
123: if (e.Shift == true)
124: {
125: SendKeys.Send("+{TAB}");
126: e.Handled = true;
127: Control c = this.ActiveControl;
128: c.BringToFront();
129: }
以上の部分のコードによって、
上記のようなことが可能になると思い、実行したものの、
フォーカスがTextBox[i-1]に移り、文字は入力できるのですが、
肝心の最前面表示ができません。

###該当のソースコード

C#

1 1:using System; 2 2:using System.Collections.Generic; 3 3:using System.ComponentModel; 4 4:using System.Data; 5 5:using System.Drawing; 6 6:using System.Linq; 7 7:using System.Text; 8 8:using System.Threading.Tasks; 9 9:using System.Windows.Forms; 10 10:using System.Collections; 11 11: 12 12: 13 13:public delegate void tb_Click(object sender, KeyPressEventArgs e); 14 14: 15 15:namespace WindowsFormsApp1 16 16:{ 17 17: public partial class Form1 : Form 18 18: { 19 19: public Form1() 20 20: { 21 21: InitializeComponent(); 22 22: } 23 23: // ------------------------------ 24 24: // クラスのメンバー変数として宣言 25 25: // ------------------------------ 26 26: // ボタンのY座標 27 27: int y = 50; 28 28: int x = 50; 29 29: 30 30: //動的リストの要素の添字として使うカウンタ 31 31: int i = 0; 32 32: int k = 0; 33 33: 34 34: //テキストボックスの大きさ 35 35: int th = 100; 36 36: int tw = 100; 37 37: 38 38: // ボタンを格納しておく動的リスト 39 39: List<Button> buttons = new List<Button>(); 40 40: // テキストボックスを格納しておく動的リスト 41 41: List<TextBox> clist = new List<TextBox>(); 42 42: 43 43: 44 44: // ------------------------------ 45 45: // ボタン1が押された時の処理 46 46: // ------------------------------ 47 47: private void button1_Click(object sender, System.EventArgs e) 48 48: { 49 49: // ボタンObjectを作成 50 50: Button myButton = new Button(); 51 51: 52 52: // ボタン位置を設定 53 53: myButton.Location = new Point(0, y); 54 54: 55 55: // ボタンを追加 56 56: this.Controls.Add(myButton); 57 57: 58 58: // ボタン同士が重ならないよう、位置をすこしずらす 59 59: y = y + 24; 60 60: 61 61: // ボタンだけを集めた動的リストに今作ったボタンを追加 62 62: buttons.Add(myButton); 63 63: 64 64: buttons[i].Click += new EventHandler(button1_Click); 65 65: 66 66: i++; 67 67: } 68 68: 69 69: private void button1_KeyPress(object sender, KeyPressEventArgs e) 70 70: { 71 71: //if (e.KeyChar == 49)//1が押されたとき 72 72: 73 73: if (e.KeyChar == (char)Keys.R)//Rキーが押されたとき 74 74: { 75 75: // ボタンObjectを作成 76 76: Button myButton = new Button(); 77 77: 78 78: //myButton.Text = Console.ReadLine(); 79 79: 80 80: // ボタン同士が重ならないよう、位置をすこしずらす 81 81: x = x + 24; 82 82: 83 83: // ボタン位置を設定 84 84: myButton.Location = new Point(x, y); 85 85: 86 86: // ボタンを追加 87 87: this.Controls.Add(myButton); 88 88: 89 89: // ボタンだけを集めた動的リストに今作ったボタンを追加 90 90: buttons.Add(myButton); 91 91: 92 92: buttons[i].Click += new EventHandler(button1_Click); 93 93: 94 94: i++; 95 95: e.Handled = true; 96 96: } 97 97: if (e.KeyChar == (char)Keys.T)//Tキーが押されたとき 98 98: { 99 99: TextBox tb = new TextBox(); 100 100: tb.Multiline = true; 101 101: tb.Top = y; 102 102: tb.Left = x; 103 103: tb.Height = th; 104 104: tb.Width = tw; 105 105: tb.Text = "hello"; 106 106: this.Controls.Add(tb); 107 107: 108 108: clist.Add(tb); 109 109: clist[k].KeyDown += new KeyEventHandler(tb_KeyDown); 110 110: clist[k].Focus(); 111 111: clist[k].BringToFront(); 112 112: y = y + 24 + 2; 113 113: x = x + 50; 114 114: e.Handled = true; 115 115: k++; 116 116: } 117 117: } 118 118: private void tb_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 119 119: { 120 120: 121 121: if (e.KeyCode == Keys.Enter) 122 122: { 123 123: if (e.Shift == true) 124 124: { 125 125: SendKeys.Send("+{TAB}"); 126 126: e.Handled = true; 127 127: Control c = this.ActiveControl; 128 128: c.BringToFront(); 129 129: } 130 130: else 131 131: { 132 132: TextBox tb = new TextBox(); 133 133: tb.Multiline = true; 134 134: tb.Top = y; 135 135: tb.Left = x; 136 136: Control c = this.ActiveControl; 137 137: tb.Top = c.Top + th; 138 138: tb.Left = c.Left + tw; 139 139: tb.Height = th; 140 140: tb.Width = tw; 141 141: tb.Text = "hello"; 142 142: this.Controls.Add(tb); 143 143: clist.Add(tb); 144 144: clist[k].KeyDown += new KeyEventHandler(tb_KeyDown); 145 145: 146 146: clist[k].Focus(); 147 147: clist[k].BringToFront(); 148 148: e.Handled = true; 149 149: k++; 150 150: } 151 151: } 152 152: if (e.Alt) 153 153: { 154 154: if (e.KeyCode == Keys.Up) 155 155: { 156 156: Control c = this.ActiveControl; 157 157: c.Top -= 5; 158 158: e.Handled = true; 159 159: } 160 160: if (e.KeyCode == Keys.Down) 161 161: { 162 162: Control c = this.ActiveControl; 163 163: c.Top += 5; 164 164: e.Handled = true; 165 165: } 166 166: if (e.KeyCode == Keys.Left) 167 167: { 168 168: Control c = this.ActiveControl; 169 169: c.Left -= 5; 170 170: e.Handled = true; 171 171: } 172 172: if (e.KeyCode == Keys.Right) 173 173: { 174 174: Control c = this.ActiveControl; 175 175: c.Left += 5; 176 176: e.Handled = true; 177 177: } 178 178: } 179 179: } 180 180: } 181 181:} 182

###試してみていること
もしかしたら、
「TextBox[i-1]にフォーカスがあること != TextBox[i-1]がアクティブであること」
なのかなと思い、その方向性で今は検索したりしています。

###補足情報(言語/FW/ツール等のバージョンなど)
環境は、
visualstudio2017 C# windowsフォームアプリケーション
です。
C言語は自作でいくつかプログラムを書いたことがありますが、
データ構造あたりまでの学習しか進んでいません。
C#は初心者です。
作りながら学ぼうとしているので、頓珍漢なことばかりして
読みづらくしてしまっていると思います。

ぜひ、知恵をお貸しいただければと思います。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

基本的にキーボード入力やその他いろいろなことはメッセージというもので通知されてきます。
メッセージはメッセージキューというものに蓄積され、WndProcメソッドにて順次処理されていきます。
イベントハンドラはこのWndProcメソッドから呼び出されます。
そして、イベントハンドラが終了しないと次のメッセージが処理されません。

そこで、下記のソースの動きですが、

C#

1private void tb_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e) 2{ 3 SendKeys.Send("+{TAB}"); // 1 4 Control c = this.ActiveControl; // 2 5 c.BringToFront(); // 3 6}

1を実行すると、"+{TAB}"のキー入力のメッセージがメッセージキューに登録されます。
この時、まだ"+{TAB}"のキー入力は処理されていないので、アクティブなコントロールは変化していません。
そして、2を実行しても、アクティブコントロールは変化していませんので、現在アクティブなコントロールが返されます。
なので、3を実行しても前面に出てくるコントロールは現在アクティブなコントロールとなります。

そして、このイベントハンドラが終了したら1でメッセージキューに登録された
"+{TAB}"のキー入力のメッセージが処理されます。
ここで初めてアクティブなコントロールが変わります。

この状態では、次にアクティブになるコントロールが分からないことになります。
ですので、Sendkeyでキーを送ってアクティブコントロールを変更させるのではなく
Control.SelectNextControl メソッドを使いましょう

投稿2017/12/19 11:49

YAmaGNZ

総合スコア10222

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kaisen

2017/12/19 11:53

YAmaGNZさん。 回答ありがとうございます。 使ってみます。
kaisen

2017/12/19 11:59

成功です!! ありがとうございました。助かりました。
kaisen

2017/12/19 12:01

125行目を this.SelectNextControl(this.ActiveControl, false, true, true, true); に変更しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問