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#は初心者です。
作りながら学ぼうとしているので、頓珍漢なことばかりして
読みづらくしてしまっていると思います。
よろしくお願いします。