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

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

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

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

Q&A

2回答

4582閲覧

複数のFormでソフトウェアキーボードを共通化したいです。

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

0グッド

1クリップ

投稿2015/11/10 06:06

C# Visual Studio 2013で開発しています。OSはWindows8.1です。
Formアプリケーションを作っています。
複数のFormで共通のUIパーツ、具体的にはソフトウェアキーボードを使おうと考えています。

方法はいくつもあると思いますが、ユーザーコントロールを使う方法を試しています。
これまでの手順は次のとおりです。

1)Form1をつくる。
2)Form1にキーボードから入力を受けるTextBox1を配置。
3)Form2をつくる。
4)Form2にキーボードから入力を受けるTextBox2を配置。
5)UserControlを作る。
6)UserControlにキーボードになるButtonを複数配置。
7)たとえば「R」のキーにクリックイベントのイベントハンドラを設定。
8)動作確認で、
private void buttonR_Click(object sender, EventArgs e) {
MessageBox.Show("R");
}
と設定。
9)Form1のデザインでUserControlでkeyboardをドラッグして配置。
10)デバッグ実行。Form1を表示。Rのキーを押してMessageBoxが出るのを確認。

さてそれで、このForm1のUserControlのキーから、Form1のTextBox1に入力を受け付けるには、どこになにを書けばよいでしょう。

なにを、は、
TextBox1.Text += "R";
なのだと思うのですが。
アドバイスをよろしくお願いします。

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

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

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

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

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

Tak1wa

2015/11/10 06:10

Form2が作りっぱなしですが、その後どのあたりで関係してくるのでしょうか。
guest

回答2

0

こんにちは。

単純にユーザコントロールのイベントを親で処理したいというふうに読み取れるんですが…
ユーザコントロールでイベントを発生させてやれば良いのでは。

C#

1public partial class UserControl1 : UserControl 2{ 3 public UserControl1() 4 { 5 InitializeComponent(); 6 } 7 8 public event EventHandler<KeyEventArgs> HogeClick; 9 private void OnHogeClick(Keys key) 10 { 11 var h = this.HogeClick; 12 if (h != null) 13 { 14 h(this, new KeyEventArgs(key)); 15 } 16 } 17 18 private void button1_Click(object sender, EventArgs e) 19 { 20 OnHogeClick(Keys.R); 21 } 22 23 private void button2_Click(object sender, EventArgs e) 24 { 25 OnHogeClick(Keys.S); 26 } 27} 28 29public partial class Form1 : Form 30{ 31 public Form1() 32 { 33 InitializeComponent(); 34 userControl11.HogeClick += userControl11_HogeClick; 35 } 36 37 void userControl11_HogeClick(object sender, KeyEventArgs e) 38 { 39 if(e.KeyData == Keys.R) 40 { 41 textBox1.Text += "R"; 42 } 43 else if(e.KeyData == Keys.S) 44 { 45 textBox1.Text += "S"; 46 } 47 } 48 49}

※面倒だったのでKeyEventArgs使いました

どちらにせよ、ユーザコントロールで押された内容を以て、テキストボックスにテキストを追加するのか、上書きするのか、テキストではなくラベルなのか、は使う側が決めれば良いので、ユーザコントロールは押されたことだけを通知すれば良いです。

投稿2015/11/10 07:31

Tak1wa

総合スコア4791

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

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

0

いろいろ方法はありますが、手軽で汎用性の高さを考えるならインターフェイスを使うのがいいでしょう。
流れとしてはこんな感じです。

① インターフェイスを追加。通常のクラスと同じ手順で「インターフェイス」を選びます。

② インターフェイスに受け口となるメソッドを追加。publicは不要。中身も不要。
void ClickButton(char ch);

③ それぞれのフォームにインターフェイスを追加。
public partial class Form1 : Form, Interface1

④ インターフェイスのメソッドを実装。※Form側に実装します。
例えばこんな感じ

public void ClickButton(char ch) { textBox1.Text += ch; }

⑤UserControlのボタンクリックイベントで、親フォームの上記で追加したインターフェイスを呼び出す。※UserControl側に実装します。
例えばこんな感じ

private void buttonR_Click(object sender, EventArgs e) { ((Interface1)this.ParentForm).ClickButton('R'); // Parentだと問題があるのでParentFormに修正 }

だいたいこんな感じでユーザーコントロールのクリックイベントを親フォームに受け渡すことができます。
※③以降の手順は前後してもかまいません。

投稿2015/11/10 07:05

編集2015/11/10 07:49
catsforepaw

総合スコア5938

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問