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

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

ただいまの
回答率

91.26%

  • C#

    5011questions

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

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 91

kaisen

score 10

前提・実現したいこと

こんばんは。
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ページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

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

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


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

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/12/19 12:29

    YAmaGNZさん。
    回答ありがとうございます。

    >>tb_clickとありますが、ClickイベントではなくKeyPressイベントなのではないですか?
    まさしくです。
    ClickとKeyPressを混同して使うなんて、完全に見落としてました。

    ```C#
    clist[k].KeyPress += new EventHandler(tb_Click);
    ```
    このようにしてみました。試してきます。

    キャンセル

  • 2017/12/19 12:39

    YAmaGNZさん。

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

    キャンセル

  • 2017/12/19 12:47

    エラーメッセージにあるように、KeyPressイベントのイベントハンドラはKeyPressEventHandlerとなります。
    ですので、
    clist[k].KeyPress += new KeyPressEventHandler(tb_Click);
    としなくてはなりません。

    また、エラーとは直接関係はありませんが、tb_Clickはtb_Keypressのように
    分かりやすい名称に変えておきましょう。

    キャンセル

  • 2017/12/19 13:01

    YAmaGNZさん。

    >>KeyPressイベントのイベントハンドラはKeyPressEventHandlerとなり
    教えていただいたとおりに変更したところ、
    無事、動かすことができました。思っていた通りに動いてくれました。

    >>分かりやすい名称に変えておきましょう。
    すぐに変えます。使っていて自分でも混乱していました。


    非常に助かりました。ありがとうございました!

    キャンセル

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

ただいまの回答率

91.26%

関連した質問

同じタグがついた質問を見る

  • C#

    5011questions

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

  • トップ
  • C#に関する質問
  • エラーCS0123 デリゲート 'EventHandler' に一致する 'tb_Click' のオーバーロードは~以下略