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

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

ただいまの
回答率

91.25%

  • C#

    5010questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 59

kaisen

score 10

前提・実現したいこと

こんばんは。
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]に移り、文字は入力できるのですが、
肝心の最前面表示ができません。

該当のソースコード

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

試してみていること

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

補足情報(言語/FW/ツール等のバージョンなど)

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

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

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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

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


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

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

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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/19 20:53

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

    キャンセル

  • 2017/12/19 20:59

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

    キャンセル

  • 2017/12/19 21:01

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

    キャンセル

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

ただいまの回答率

91.25%

関連した質問

  • 解決済

    HTML キーの同時押し

    お世話になります。 HTMLでパソコンのキーボードから押したボタンによって動作が分岐する機能を作成しています。 現在上記のプログラムはできたのですが、更にキーを同時に押

  • 解決済

    DataGridView セル移動

    前提・実現したいこと DataGridViewのセルでEnterを押したときに「下行へ移動」ではなく「右列に移動」をさせたい。 ※「Enterが押下される」という動作のコー

  • 解決済

    Enterキーだけが押されたときにイベントを発火させる方法

    Shift+Enterなどではイベントは発火せずに、Enterのみが押されたときにのみイベントが発生するようにしたいと思っています。 現状以下のようなものを作ってみたのですが

  • 受付中

    C#でGUI上の画像の上にテキストボックスの表示

    ●目的 GUIで表示された画像(表示済)の上にテキストボックスに表示 (別コードでセンサーのデータを取得し、その値を表示) ()の方法は、わかります。 ●トラブル

  • 解決済

    WPFのコンボボックスなどのアイテムを非表示にする方法

    以前、WPFのコンボボックスで質問をさせていただいたのですが、もう一点 xaml上で記述したコンボボックスを非表示(グレーアウトではなく非表示)にする場合どのようにすればよろしい

  • 解決済

    CS103:現在のコンテキスト内に存在しません。

    C# を現在VisualStudio を使わずに書いています。 プロジェクトには以下のファイルがあります。 main.cs Form1.cs ←どちらもクラス名は同

  • 解決済

    .NET Windows アプリケーションでのALTキー抑制方法

    .NET 3.5 を利用してWindows アプリケーションを作成しています。 Windows が表示された状態で、ALtキーを押下すると、左上のアイコンにフォーカスが 設定さ

  • 受付中

    Microsoft Visual Studioでのerror (C#)

    前提・実現したいこと Visual Studioを使っているのですが、Console.WriteLineの行でエラーが発生します。 考えられる対処法はないでしょうか 当方プログラミ

同じタグがついた質問を見る

  • C#

    5010questions

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