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

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

ただいまの
回答率

91.07%

  • C#

    5530questions

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

CS1061 'object' に 'Click' の定義が含まれておらず、~以下略

解決済

回答 1

投稿

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

kaisen

score 13

簡単に自己紹介します。
C#にてフォームアプリを作り始めようとしている初心者です。
C言語では簡単なプログラムを自作したことがあります。
そもそもオブジェクト指向や、C#の文法に関する知識がない(参考書の流し読みなど)ので、
知識をつけながら作るつもりなので頓珍漢なことをたくさんやっています。

本題です。
button1を押すたびに、
新たなbutton[i]が生成され、
その生成されたbutton[i]を配列に加えて、
その生成されたbutton[i]を押すと、
さらに新たなbutton[i]が生成され。。。
といったようなことをやろうとしているのですが、

エラー


CS1061    'object' に 'Click' の定義が含まれておらず、型 'object' の最初の引数を受け付ける拡張メソッド 'Click' が見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足していないことを確認してください。

が出ます。

これを解決するにはどのようにすればいいでしょうか。
知恵を貸していただければ幸いです。

該当のソースコード

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Collections;

namespace WindowsFormsApp1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        // ------------------------------
        // クラスのメンバー変数として宣言
        // ------------------------------
        // ボタンのY座標
        int y = 0;

        // ボタンを格納しておく動的リスト
        // (動的に数が増えていく物はArrayListで管理するのが楽です)
        ArrayList buttons = new ArrayList();

        // ------------------------------
        // ボタン1が押された時の処理
        // ------------------------------
        private void button1_Click(object sender, System.EventArgs e)
        {
            // ボタンObjectを作成
            Button myButton = new Button();

            // ボタン文字列を定義
            myButton.Text = "AAA";

            // ボタン位置を設定
            myButton.Location = new Point(0, y);

            // ボタンを追加
            this.Controls.Add(myButton);

            // ボタン同士が重ならないよう、位置をすこしずらす
            y = y + 24;

            // ボタンだけを集めた動的リストに今作ったパネルを追加
            buttons.Add(myButton);

            buttons[0].Click += new EventHandler(button1_Click);

        }

        private void button2_Click(object sender, EventArgs e)
        {
            List<TextBox> clist = new List<TextBox>();

            int y = 64;
            int x = 64;
            for (int i = 0; i < 5; i++)
            {
                TextBox tb = new TextBox();
                tb.Top = y;
                tb.Left = x;
                tb.Height = 24;
                tb.Width = 180;
                this.Controls.Add(tb);

                clist.Add(tb);
                y = y + 24 + 2;
                x = x + 50;
            }
        }
    }

試したこと

使っているクラスの中にClickメソッドが含まれていないと思い、
buttons[0].Click += new EventHandler(button1_Click);
の部分を
this.buttons[0].Click~だとか、
WindowsFormApp1.Form.buttons[0].Click~とかに変えてみたりしました。

補足情報(言語/FW/ツール等のバージョンなど)

visualstudio2017 C# windowsフォームアプリケーション

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

+1

ArrayList buttons = new ArrayList();

ではなく

List<Button> buttons = new List<Button>();

とでもすれば、とりあえずエラーは起きなくなるかと思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/12/18 18:12

    迅速な回答ありがとうございます。
    やってきます。

    キャンセル

  • 2017/12/18 18:15

    教えていただいたとおりに変更したところ、
    エラーは消えました。

    ありがとうございました!

    キャンセル

  • 2017/12/18 18:20 編集

    間違えて投稿しました。編集、削除済み。

    キャンセル

  • 2017/12/19 09:07

    ArrayListだと各要素がObjectとして扱われます。ObjectにはClickというイベントが存在しないため、「'object' に 'Click' の定義が含まれておらず」と言われてしまいます。
    一方、List<Button>であれば各要素はButtonとして扱われますので、Clickイベントを参照できてエラーにならない、ということです。

    キャンセル

  • 2017/12/19 12:22

    algさん。

    そうですか。
    ArrayListは、objectを扱い、
    Listは、イベントも扱える。
    ttp://www.atmarkit.co.jp/ait/articles/1710/25/news023.html
    こんなページもありました。
    この先、非常に役立ちそうです。

    勉強しなおしてきます。
    すっきりしました。ありがとうございます。

    キャンセル

  • 2017/12/19 13:14

    私の説明が言葉足らずなため、微妙な誤解をさせているかもしれません。
    > Listは、イベントも扱える。
    という文だとちょっと正確ではなく、あえて補足するなら
    「List(<Button>)は、(各要素がButtonとして扱われるため各要素へのアクセス時に)イベントも扱える。」
    ですかね。カッコ内が補足です。
    Listそのものがイベントを扱えるわけではなく、List<T>の各要素にアクセスした際に各要素がobjectではなくTとして解釈されるので、Tが持つイベントやプロパティなどを参照できる、ということです。

    キャンセル

  • 2017/12/19 14:42

    algさん。

    >「List(<Button>)は、(各要素がButtonとして扱われるため各要素へのアクセス時に)イベントも
    >扱える。」ですかね。カッコ内が補足です。
    たとえば、List<label>であれば、
    labelというコントロールがリストに格納された要素になるのですね。
    イベントはあくまでも、このコントロールの持つイベントだから参照できるということですか?

    配列=静的にメモリを確保できる。コントロールは格納できない。
    ArrayList=動的にメモリを確保できる。コントロールは格納できない。
    List=動的にメモリを確保できる。コントロールも格納できる。

    ArrayListよりも広い範囲のものが扱えるなら、
    あえてArrayListを使う場面というのは、ないのでしょうか。


    詳細な説明、ありがとうございます。勉強になります。

    キャンセル

  • 2017/12/19 15:44

    > たとえば、List<label>であれば、
    > labelというコントロールがリストに格納された要素になるのですね。
    そうです。

    > イベントはあくまでも、このコントロールの持つイベントだから参照できるということですか?
    そうです。

    > ArrayListよりも広い範囲のものが扱えるなら、
    > あえてArrayListを使う場面というのは、ないのでしょうか。
    今から作るものでArrayListを使う理由は、あまり無い気がしますね。
    ArrayList は .NET Framework 1.1 からありますが、List<T> は .NET Framework 2.0 以降で使えるようになりました。
    そのため、1.1時代に書かれたコードを2.0以降に対応するよう書き直す場合に、書き直す量を減らすために ArrayList のままにする、というような状況なら、ArrayListを採用する理由になるかもしれません。

    キャンセル

  • 2017/12/19 16:00

    algさん。

    少し理解できた気がします。
    少なくとも、理解したと思い込まずに済みました。
    ありがとうございます。助かりました。

    >今から作るものでArrayListを使う理由は、あまり無い気がしますね。
    >ArrayList は .NET Framework 1.1 からありますが、List<T> は .NET Framework 2.0 以降で使える
    >ようになりました。
    >そのため、1.1時代に書かれたコードを2.0以降に対応するよう書き直す場合に、書き直す量を減らすた
    >めに ArrayList のままにする、というような状況なら、ArrayListを採用する理由になるかもしれませ
    >ん。
    そうだったのですか。歴史が理由だったのですね。
    また一つ、勉強になりました。ありがとうございます。

    キャンセル

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

  • ただいまの回答率 91.07%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

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

  • C#

    5530questions

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