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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
kaisen
記事: 3
登録日時: 6年前

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

#1

投稿記事 by kaisen » 6年前

こんばんは。
C#でフォームアプリを作成しています。
問題が発生し、ぜひ、知恵を貸していただきたいと思い、
投稿させていただきました。

・実現したいことは、

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

・以下に、ソースコードを掲載します。

コード:

using System;
using System.Collections.Generic;
using System.Drawing;
using System.Windows.Forms;


public delegate void tb_Click(object sender, KeyPressEventArgs e);

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        // ------------------------------
        // クラスのメンバー変数として宣言
        // ------------------------------
        // ボタンのY座標
        int y = 50;
        int x = 50;

        //動的リストの要素の添字として使うカウンタ
        int i = 0;
        int k = 0;

        //テキストボックスの大きさ
        int th = 100;
        int tw = 100;

        // ボタンを格納しておく動的リスト
        List<Button> buttons = new List<Button>();
        // テキストボックスを格納しておく動的リスト
        List<TextBox> clist = new List<TextBox>();


        // ------------------------------
        // ボタン1が押された時の処理
        // ------------------------------
        private void button1_Click(object sender, System.EventArgs e)
        {
            // ボタンObjectを作成
            Button myButton = new Button();

            // ボタン位置を設定
            myButton.Location = new Point(0, y);

            // ボタンを追加
            this.Controls.Add(myButton);

            // ボタン同士が重ならないよう、位置をすこしずらす
            y = y + 24;

            // ボタンだけを集めた動的リストに今作ったボタンを追加
            buttons.Add(myButton);

            buttons[i].Click += new EventHandler(button1_Click);

            i++;
        }

        private void button1_KeyPress(object sender, KeyPressEventArgs e)
        {
            //if (e.KeyChar == 49)//1が押されたとき

            if (e.KeyChar == (char)Keys.R)//Rキーが押されたとき
            {
                // ボタンObjectを作成
                Button myButton = new Button();

                //myButton.Text = Console.ReadLine();

                // ボタン同士が重ならないよう、位置をすこしずらす
                x = x + 24;

                // ボタン位置を設定
                myButton.Location = new Point(x, y);

                // ボタンを追加
                this.Controls.Add(myButton);

                // ボタンだけを集めた動的リストに今作ったボタンを追加
                buttons.Add(myButton);

                buttons[i].Click += new EventHandler(button1_Click);

                i++;
                e.Handled = true;
            }
            if (e.KeyChar == (char)Keys.T)//Tキーが押されたとき
            {
                TextBox tb = new TextBox();
                tb.Multiline = true;
                tb.Top = y;
                tb.Left = x;
                tb.Height = th;
                tb.Width = tw;
                tb.Text = "hello";
                this.Controls.Add(tb);

                clist.Add(tb);
                clist[k].KeyDown += new KeyEventHandler(tb_KeyDown);
                clist[k].Focus();
                clist[k].BringToFront();
                y = y + 24 + 2;
                x = x + 50;
                e.Handled = true;
                k++;
            }
        }
        private void tb_KeyDown(object sender, System.Windows.Forms.KeyEventArgs e)
        {

            if (e.KeyCode == Keys.Enter)
                {
                if (e.Shift == true)
                {
                    SendKeys.Send("+{TAB}");
                    e.Handled = true;
                    Control c = this.ActiveControl;
                    c.BringToFront();
                }
                else
                {
                    TextBox tb = new TextBox();
                    tb.Multiline = true;
                    tb.Top = y;
                    tb.Left = x;
                    Control c = this.ActiveControl;
                    tb.Top = c.Top + th;
                    tb.Left = c.Left + tw;
                    tb.Height = th;
                    tb.Width = tw;
                    tb.Text = "hello";
                    this.Controls.Add(tb);
                    clist.Add(tb);
                    clist[k].KeyDown += new KeyEventHandler(tb_KeyDown);
                    
                    clist[k].Focus();
                    clist[k].BringToFront();
                    e.Handled = true;
                    k++;
                }
            }
            if (e.Alt)
            {
                if (e.KeyCode == Keys.Up)
                {
                    //if (clist.Count <= k-1)
                    //{
                    //    
                    //    clist[k].Top -= 1;
                    //    e.Handled = true;
                    //}
                    //if(clist.Count > k-1)
                    //{
                    //    clist[k-1].Top -= 1;
                    //    e.Handled = true;
                    //}
                    Control c = this.ActiveControl;
                    c.Top -= 5;
                    e.Handled = true;
                }
                if (e.KeyCode == Keys.Down)
                {
                    Control c = this.ActiveControl;
                    c.Top += 5;
                    e.Handled = true;
                }
                if (e.KeyCode == Keys.Left)
                {
                    Control c = this.ActiveControl;
                    c.Left -= 5;
                    e.Handled = true;
                }
                if (e.KeyCode == Keys.Right)
                {
                    Control c = this.ActiveControl;
                    c.Left += 5;
                    e.Handled = true;
                }
            }
        }
    }
}
```

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

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

よろしくお願いします。

kaisen
記事: 3
登録日時: 6年前

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

#2

投稿記事 by kaisen » 6年前

トピックを立てておいて申し訳ないのですが、
この掲示板のルールを見直していたところ、
私はマルチポストという行為をしてしまったことに気付きました。

teratailの方で、これと同じ質問をしてしまっています。

大変申し訳ないのですが、
このトピックに関しては締め切らせていただきます。

最後まで読んでくださった方々、ありがとうございました。
そして、申し訳ありませんでした。二度としません。

アバター
Dixq (管理人)
管理人
記事: 1661
登録日時: 13年前
住所: 北海道札幌市
連絡を取る:

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

#3

投稿記事 by Dixq (管理人) » 6年前

プライベートメッセージ拝見しました。
うちが禁じているのはマルチポストだと明記せずにマルチポストする行為です。
マルチポストしており、相互リンクされていたら問題ないです。

何故このようなルールがあるか、回答者の立場になってもらったら分かり易いかと思います。
親身に時間をかけて回答したが、実はすでに違うサイトで解決済みになっており、質問者はもう回答を見にきもしない。
そんなことがかつてありました。
回答者に失礼のないように考えてもらえたらそれはうちで禁じるような行為ではありません。

kaisen
記事: 3
登録日時: 6年前

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

#4

投稿記事 by kaisen » 6年前

Dixq (管理人) 様。

長らく返信気づかずに申し訳ありません。
「解決」ボタンに気付かず、解決済みにするのも忘れていました。

>マルチポストしており、相互リンクされていたら問題ないです。
再度相互リンクするように編集しなおします。
この投稿自体は編集できないようなので、リンクだけ追記させていただきます。
ttps://teratail.com/questions/105549
解決済みです。

>何故このようなルールがあるか、回答者の立場になってもらったら分かり易いかと思います。
>親身に時間をかけて回答したが、実はすでに違うサイトで解決済みになっており、質問者はもう回答を見にきもしない。
>そんなことがかつてありました。
>回答者に失礼のないように考えてもらえたらそれはうちで禁じるような行為ではありません。
わかりました、お騒がせしました。
そのようなことがないよう、今後気を付けていきます。

返信

“C言語何でも質問掲示板” へ戻る