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

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

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

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

Q&A

解決済

1回答

9202閲覧

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

kaisen

総合スコア28

C#

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

0グッド

0クリップ

投稿2017/12/18 09:04

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

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

###エラー

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

が出ます。

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

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

C#

1 2using System; 3using System.Collections.Generic; 4using System.ComponentModel; 5using System.Data; 6using System.Drawing; 7using System.Linq; 8using System.Text; 9using System.Threading.Tasks; 10using System.Windows.Forms; 11using System.Collections; 12 13namespace WindowsFormsApp1 14{ 15 public partial class Form1 : Form 16 { 17 public Form1() 18 { 19 InitializeComponent(); 20 } 21 // ------------------------------ 22 // クラスのメンバー変数として宣言 23 // ------------------------------ 24 // ボタンのY座標 25 int y = 0; 26 27 // ボタンを格納しておく動的リスト 28 // (動的に数が増えていく物はArrayListで管理するのが楽です) 29 ArrayList buttons = new ArrayList(); 30 31 // ------------------------------ 32 // ボタン1が押された時の処理 33 // ------------------------------ 34 private void button1_Click(object sender, System.EventArgs e) 35 { 36 // ボタンObjectを作成 37 Button myButton = new Button(); 38 39 // ボタン文字列を定義 40 myButton.Text = "AAA"; 41 42 // ボタン位置を設定 43 myButton.Location = new Point(0, y); 44 45 // ボタンを追加 46 this.Controls.Add(myButton); 47 48 // ボタン同士が重ならないよう、位置をすこしずらす 49 y = y + 24; 50 51 // ボタンだけを集めた動的リストに今作ったパネルを追加 52 buttons.Add(myButton); 53 54 buttons[0].Click += new EventHandler(button1_Click); 55 56 } 57 58 private void button2_Click(object sender, EventArgs e) 59 { 60 List<TextBox> clist = new List<TextBox>(); 61 62 int y = 64; 63 int x = 64; 64 for (int i = 0; i < 5; i++) 65 { 66 TextBox tb = new TextBox(); 67 tb.Top = y; 68 tb.Left = x; 69 tb.Height = 24; 70 tb.Width = 180; 71 this.Controls.Add(tb); 72 73 clist.Add(tb); 74 y = y + 24 + 2; 75 x = x + 50; 76 } 77 } 78 }

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

###補足情報(言語/FW/ツール等のバージョンなど)
visualstudio2017 C# windowsフォームアプリケーション

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

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

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

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

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

guest

回答1

0

ベストアンサー

ArrayList buttons = new ArrayList();

ではなく

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

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

投稿2017/12/18 09:08

alg

総合スコア2019

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

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

kaisen

2017/12/18 09:12

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

2017/12/18 09:15

教えていただいたとおりに変更したところ、 エラーは消えました。 ありがとうございました!
kaisen

2017/12/18 09:20 編集

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

2017/12/19 00:07

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

2017/12/19 03:22

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

2017/12/19 04:14

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

2017/12/19 05:42

algさん。 >「List(<Button>)は、(各要素がButtonとして扱われるため各要素へのアクセス時に)イベントも >扱える。」ですかね。カッコ内が補足です。 たとえば、List<label>であれば、 labelというコントロールがリストに格納された要素になるのですね。 イベントはあくまでも、このコントロールの持つイベントだから参照できるということですか? 配列=静的にメモリを確保できる。コントロールは格納できない。 ArrayList=動的にメモリを確保できる。コントロールは格納できない。 List=動的にメモリを確保できる。コントロールも格納できる。 ArrayListよりも広い範囲のものが扱えるなら、 あえてArrayListを使う場面というのは、ないのでしょうか。 詳細な説明、ありがとうございます。勉強になります。
alg

2017/12/19 06:44

> たとえば、List<label>であれば、 > labelというコントロールがリストに格納された要素になるのですね。 そうです。 > イベントはあくまでも、このコントロールの持つイベントだから参照できるということですか? そうです。 > ArrayListよりも広い範囲のものが扱えるなら、 > あえてArrayListを使う場面というのは、ないのでしょうか。 今から作るものでArrayListを使う理由は、あまり無い気がしますね。 ArrayList は .NET Framework 1.1 からありますが、List<T> は .NET Framework 2.0 以降で使えるようになりました。 そのため、1.1時代に書かれたコードを2.0以降に対応するよう書き直す場合に、書き直す量を減らすために ArrayList のままにする、というような状況なら、ArrayListを採用する理由になるかもしれません。
kaisen

2017/12/19 07:00

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問