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

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

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

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

Q&A

解決済

1回答

8206閲覧

エラーCS0123 デリゲート 'EventHandler' に一致する 'tb_Click' のオーバーロードは~以下略

kaisen

総合スコア28

C#

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

0グッド

0クリップ

投稿2017/12/18 13:42

編集2017/12/18 14:12

###前提・実現したいこと
こんばんは。
C#でフォームアプリを作成中にタイトルのようなエラーが出ました。

実現したいことは、

「まず、
Buttonを選択中に「T」キーを押すことで、TextBox[A]を生成する。

TextBox[A]でテキスト入力中に特定のキーを入力することで、
あらたなTextBox[B]を生成する。

さらに、そのTextBox[B]においても同じ特定のキーを入力することで、
TextBox[C]を生成する、、、」

というような動作をするフォームアプリを作ることです。

以下、
エラーと、それが出たソースコードを記載します。

###発生している問題・エラーメッセージ

エラー CS0123 デリゲート '' に一致する 'tb_Click' のオーバーロードはありません 144行目 エラー CS0123 デリゲート 'EventHandler' に一致する 'tb_Click' のオーバーロードはありません 164行目

###該当のソースコード

C#

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

###試したこと
private void tb_Click(object sender, KeyPressEventArgs e)
という部分は、
私が勝手にソースコードに試しに書いたものであって、
デザイナーを使って自動的に生成されたコードではありません。

現時点では、
エラー本文を検索したり、
デリゲートやらオーバーロードについて勉強しながら、
解決策を見出そうとしています。

###補足情報(言語/FW/ツール等のバージョンなど)
環境は、
visualstudio2017 C# windowsフォームアプリケーション
です。
C言語は自作でいくつかプログラムを書いたことがありますが、
データ構造あたりまでの学習しか進んでいません。
C#は初心者です。

作りながら学ぼうとしているので、頓珍漢なことばかりして
読みづらくしてしまっていると思います。

知恵をお貸しいただきたければ幸いです。
よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

tb_clickとありますが、ClickイベントではなくKeyPressイベントなのではないですか?

C#

1clist[k].Click += new EventHandler(tb_Click);

これは、Clickイベントのイベントハンドラとしてtb_Clickという関数を登録するものです。
ちゃんとKeyPressイベントのイベントハンドラとして登録しましょう。

投稿2017/12/18 22:08

YAmaGNZ

総合スコア10222

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

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

kaisen

2017/12/19 03:29

YAmaGNZさん。 回答ありがとうございます。 >>tb_clickとありますが、ClickイベントではなくKeyPressイベントなのではないですか? まさしくです。 ClickとKeyPressを混同して使うなんて、完全に見落としてました。 ```C# clist[k].KeyPress += new EventHandler(tb_Click); ``` このようにしてみました。試してきます。
kaisen

2017/12/19 03:39

YAmaGNZさん。 ```エラー CS0029型 'System.EventHandler' を 'System.Windows.Forms.KeyPressEventHandler' に暗黙的に変換できません 146 CS0123デリゲート 'EventHandler' に一致する 'tb_Click' のオーバーロードはありません 146 ``` となりました。 なにか、変換するのでしょうか?
YAmaGNZ

2017/12/19 03:47

エラーメッセージにあるように、KeyPressイベントのイベントハンドラはKeyPressEventHandlerとなります。 ですので、 clist[k].KeyPress += new KeyPressEventHandler(tb_Click); としなくてはなりません。 また、エラーとは直接関係はありませんが、tb_Clickはtb_Keypressのように 分かりやすい名称に変えておきましょう。
kaisen

2017/12/19 04:01

YAmaGNZさん。 >>KeyPressイベントのイベントハンドラはKeyPressEventHandlerとなり 教えていただいたとおりに変更したところ、 無事、動かすことができました。思っていた通りに動いてくれました。 >>分かりやすい名称に変えておきましょう。 すぐに変えます。使っていて自分でも混乱していました。 非常に助かりました。ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問