前提・実現したいこと
こんばんは。
C#でフォームアプリを作成中にタイトルのようなエラーが出ました。
実現したいことは、
「まず、
Buttonを選択中に「T」キーを押すことで、TextBox[A]を生成する。
TextBox[A]でテキスト入力中に特定のキーを入力することで、
あらたなTextBox[B]を生成する。
さらに、そのTextBox[B]においても同じ特定のキーを入力することで、
TextBox[C]を生成する、、、」
というような動作をするフォームアプリを作ることです。
以下、
エラーと、それが出たソースコードを記載します。
発生している問題・エラーメッセージ
エラー CS0123 デリゲート '' に一致する 'tb_Click' のオーバーロードはありません 144行目
エラー CS0123 デリゲート 'EventHandler' に一致する 'tb_Click' のオーバーロードはありません 164行目
該当のソースコード
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:namespace WindowsFormsApp1
13:{
14: public partial class Form1 : Form
15: {
16: public Form1()
17: {
18: InitializeComponent();
19: }
20: // ------------------------------
21: // クラスのメンバー変数として宣言
22: // ------------------------------
23: // ボタンのY座標
24: int y =50;
25: int x = 50;
26:
27: //動的リストの要素の添字として使うカウンタ
28: int i = 0;
29: int k = 0;
30:
31: // ボタンを格納しておく動的リスト
32: List<Button> buttons = new List<Button>();
33: // テキストボックスを格納しておく動的リスト
34: List<TextBox> clist = new List<TextBox>();
35:
36:
37: // ------------------------------
38: // ボタン1が押された時の処理
39: // ------------------------------
40: private void button1_Click(object sender, System.EventArgs e)
41: {
42: // ボタンObjectを作成
43: Button myButton = new Button();
44:
45: // ボタン位置を設定
46: myButton.Location = new Point(0, y);
47:
48: // ボタンを追加
49: this.Controls.Add(myButton);
50:
51: // ボタン同士が重ならないよう、位置をすこしずらす
52: y = y + 24;
53:
54: // ボタンだけを集めた動的リストに今作ったボタンを追加
55: buttons.Add(myButton);
56:
57: buttons[i].Click += new EventHandler(button1_Click);
58:
59: i++;
60: }
61:
62: private void button2_Click(object sender, EventArgs e)
63: {
64:
65: int y = 64;
66: int x = 64;
67: for (int a = 0; a < 5; a++)
68: {
69: TextBox tb = new TextBox();
70: tb.Top = y;
71: tb.Left = x;
72: tb.Height = 24;
73: tb.Width = 180;
74: tb.Text = "hello";
75: this.Controls.Add(tb);
76:
77: clist.Add(tb);
78: y = y + 24 + 2;
79: x = x + 50;
80: }
81: }
82:
83: private void button1_KeyPress(object sender, KeyPressEventArgs e)
84: {
85: //if (e.KeyChar == 49)//1が押されたとき
86:
87: if (e.KeyChar == (char)Keys.D)//Dキーが押されたとき
88: {
89: // ボタンObjectを作成
90: Button myButton = new Button();
91:
92: // ボタン同士が重ならないよう、位置をすこしずらす
93: y = y + 24;
94:
95: // ボタン位置を設定
96: myButton.Location = new Point(x, y);
97:
98: // ボタンを追加
99: this.Controls.Add(myButton);
100:
101: // ボタンだけを集めた動的リストに今作ったパネルを追加
102: buttons.Add(myButton);
103:
104: buttons[i].Click += new EventHandler(button1_Click);
105:
106: i++;
107: e.Handled = true;
108: }
109: if (e.KeyChar == (char)Keys.R)//Rキーが押されたとき
110: {
111: // ボタンObjectを作成
112: Button myButton = new Button();
113:
114: //myButton.Text = Console.ReadLine();
115:
116: // ボタン同士が重ならないよう、位置をすこしずらす
117: x = x + 24;
118:
119: // ボタン位置を設定
120: myButton.Location = new Point(x, y);
121:
122: // ボタンを追加
123: this.Controls.Add(myButton);
124:
125: // ボタンだけを集めた動的リストに今作ったパネルを追加
126: buttons.Add(myButton);
127:
128: buttons[i].Click += new EventHandler(button1_Click);
129:
130: i++;
131: e.Handled = true;
132: }
133: if (e.KeyChar == (char)Keys.T)//Tキーが押されたとき
134: {
135: TextBox tb = new TextBox();
136: tb.Top = y;
137: tb.Left = x;
138: tb.Height = 24;
139: tb.Width = 180;
140: tb.Text = "hello";
141: this.Controls.Add(tb);
142:
143: clist.Add(tb);
144: clist[k].Click += new EventHandler(tb_Click);
145: y = y + 24 + 2;
146: x = x + 50;
147: k++;
148: e.Handled = true;
149: }
150: }
151: private void tb_Click(object sender, KeyPressEventArgs e)
152: {
153:
154: if (e.KeyChar == (char)Keys.T)//Tキーが押されたとき
155: {
156: TextBox tb = new TextBox();
157: tb.Top = y;
158: tb.Left = x;
159: tb.Height = 24;
160: tb.Width = 180;
161: tb.Text = "hello";
162: this.Controls.Add(tb);
163: clist.Add(tb);
164: clist[k].Click += new EventHandler(tb_Click);
165:
166: y = y + 24 + 2;
167: x = x + 50;
168: k++;
169: e.Handled = true;
170: }
171: }
172: }
173:}
試したこと
private void tb_Click(object sender, KeyPressEventArgs e)
という部分は、
私が勝手にソースコードに試しに書いたものであって、
デザイナーを使って自動的に生成されたコードではありません。
現時点では、
エラー本文を検索したり、
デリゲートやらオーバーロードについて勉強しながら、
解決策を見出そうとしています。
補足情報(言語/FW/ツール等のバージョンなど)
環境は、
visualstudio2017 C# windowsフォームアプリケーション
です。
C言語は自作でいくつかプログラムを書いたことがありますが、
データ構造あたりまでの学習しか進んでいません。
C#は初心者です。
作りながら学ぼうとしているので、頓珍漢なことばかりして
読みづらくしてしまっていると思います。
知恵をお貸しいただきたければ幸いです。
よろしくお願いします。
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
tb_clickとありますが、ClickイベントではなくKeyPressイベントなのではないですか?
clist[k].Click += new EventHandler(tb_Click);
これは、Clickイベントのイベントハンドラとしてtb_Clickという関数を登録するものです。
ちゃんとKeyPressイベントのイベントハンドラとして登録しましょう。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 91.04%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2017/12/19 12:29
回答ありがとうございます。
>>tb_clickとありますが、ClickイベントではなくKeyPressイベントなのではないですか?
まさしくです。
ClickとKeyPressを混同して使うなんて、完全に見落としてました。
```C#
clist[k].KeyPress += new EventHandler(tb_Click);
```
このようにしてみました。試してきます。
2017/12/19 12:39
```エラー
CS0029型 'System.EventHandler' を 'System.Windows.Forms.KeyPressEventHandler' に暗黙的に変換できません 146
CS0123デリゲート 'EventHandler' に一致する 'tb_Click' のオーバーロードはありません 146
```
となりました。
なにか、変換するのでしょうか?
2017/12/19 12:47
ですので、
clist[k].KeyPress += new KeyPressEventHandler(tb_Click);
としなくてはなりません。
また、エラーとは直接関係はありませんが、tb_Clickはtb_Keypressのように
分かりやすい名称に変えておきましょう。
2017/12/19 13:01
>>KeyPressイベントのイベントハンドラはKeyPressEventHandlerとなり
教えていただいたとおりに変更したところ、
無事、動かすことができました。思っていた通りに動いてくれました。
>>分かりやすい名称に変えておきましょう。
すぐに変えます。使っていて自分でも混乱していました。
非常に助かりました。ありがとうございました!