🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

Q&A

解決済

1回答

3009閲覧

タブコントロールやタブページは回せるかどうか

退会済みユーザー

退会済みユーザー

総合スコア0

C#

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

Visual Studio

Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

0グッド

0クリップ

投稿2020/01/04 08:54

前提・実現したいこと

タブページやタブコントロールはforeachでは回せないのでしょうか?
やりたいこととしては、タブコントロールを回して、その中のタブページをさらに回して、
その中のボタンに、共通イベントを登録させることを考えています。
タブコントロール(NameはtabControl)に置かれているボタン全てに共通イベント登録処理を行うにはどうすればよいのでしょうか?
ご教示お願いします。

試したこと

NameがtabControlのタブコントロールを回そうとしました。

C#

1 foreach (Control tabpage in tabControl) 2 { 3 4 }

エラーメッセージ。

エラー CS1579 foreach ステートメントは、 'TabControl' が 'GetEnumerator' のパブリック インスタンス定義を含んでいないため、型 'TabControl' の変数に対して使用できません

NameがtabPage1のタブページを回そうとしました。

C#

1 foreach (Control tabpage in tabControl) 2 { 3 4 }

エラーメッセージ。

エラー CS1579 foreach ステートメントは、 'TabPage' が'GetEnumerator' のパブリック インスタンス定義を含んでいないため、型 'TabPage' の変数に対して使用できません

できればタブコントロールに絞って回したかったのですが、
上から回そうとしても、やはりタブコントロールの箇所で回せなくなりました。

C#

1 foreach (Control ctr in this.Controls) 2 { 3 if (ctr is TabControl) 4 { 5 foreach(Control ctr2 in ctr) 6 { 7 8 } 9 } 10 }
エラー CS1579 foreach ステートメントは、 'Control' が 'GetEnumerator' のパブリック インスタンス定義を含んでいないため、型 'Control' の変数に対して使用できません

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

Visual Studio 2019

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

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

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

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

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

y_waiwai

2020/01/04 09:24

回す、ってのが意味不明だが、なにをどうしたいというはなしかな?
Zuishin

2020/01/04 23:20

普通は実行時でなくデザイン時にイベント登録します。
退会済みユーザー

退会済みユーザー

2020/01/05 03:37

ご指摘ありがとうございます。 複数のタブページ上に大量にボタンを配置して、それらのボタンクリック処理が共通化できるので、 動的にイベント登録(コード量がかなり削減できる)と思ったのですが、やはりコードでの動的イベント登録はコンパイル後になってしまい、速度が遅くなるということでしょうか? (デザイン時にイベント登録しておくと、コンパイル時にイベント登録されて、アプリケーションの速度が、動的イベント登録より速くなるということですか?) デザイン時のイベント登録となると、大量のボタン1個1個に似たような処理を書くことになると思いますが、それは仕方ないですか?
Zuishin

2020/01/05 03:44 編集

デザイン時に動的にボタンを配置するのであればイベントハンドラも動的にするのが良いと思いますが、静的に配置しているように見えるので静的に登録しても手間はそれほど変わらずコードの統一性が増して保守しやすくなります。 一つのイベントハンドラを使い回せるので一つ一つ処理を書かなければならないわけではありません。 ボタンを選択し、プロパティグリッドの Click イベントのコンボボックスからイベントハンドラを選んでください。 またシフトを押しながらボタンを選択すると複数のボタンを選択して同じイベントハンドラを一度に登録することができます。
退会済みユーザー

退会済みユーザー

2020/01/05 05:21

ご回答ありがとうございます。 仰る通り、ボタンはデザイン時に配置しているものです。 なるほど、動的に配置したコントロールに対して動的にイベント登録、 静的(デザイン時)に配置したコントロールに対しては、静的(デザイン時)にイベント登録しておく、 というのが慣習なのですね。 勉強になります。ありがとうございます。 デザイン時でも、1つのイベントハンドラを使い回せるのですね、ありがとうございます。 複数コントロールを一括で同一のイベントハンドラに登録する方法も教えていただきありがとうございます。
guest

回答1

0

ベストアンサー

TabControlクラスのプロパティを確認してください。
タブページはTabControl.TabPagesプロパティに格納されています。

自分の取得したい物がどこに格納されているのか、リファレンスを見て確認するようにしましょう。

また、ループでコントロールを見つけて処理をするようなサンプルは検索すれば結構あるはずです。

投稿2020/01/04 09:08

YAmaGNZ

総合スコア10469

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

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

退会済みユーザー

退会済みユーザー

2020/01/04 11:01

ご回答ありがとうございます。 TabControl.TabPagesプロパティで回せました。 TabPagesでボタンのみを回すことはできないですか? やるとすれば、下記のように判定するしかないですか? //tPageはタブページのインスタンス。 foreach (Control ctrl in tPage.Controls) { if(ctrl is Button) { Console.WriteLine(ctrl.Name); } } https://docs.microsoft.com/ja-jp/dotnet/api/system.windows.forms.tabpage?view=netframework-4.8 のリファレンスは見ましたが、Controlsプロパティしかなさそうでした。 また、「tabpage ループ C#」などで検索しましたが、特に情報が見つかりませんでした。
YAmaGNZ

2020/01/04 16:51

タブページ内のコントロールはボタンだけ等種類毎に管理されている訳ではないので、Controlsから取得するしかありません。 foreachで回して各項目をボタンかどうか判断するか、LINQで取得するという形になるかと思います。
退会済みユーザー

退会済みユーザー

2020/01/04 18:33

ご回答ありがとうございます。 今回の目的のコードは、 foreach(TabPage tPage in tabControl.TabPages) { //tPageはタブページのインスタンス。 foreach (Control ctrl in tPage.Controls) { if(ctrl is Button) { //ボタンに関する処理。 } } } でできそうですが、上記はLINQでどのように書けますか? tabControl.TabPages.としたところ、候補としてLINQのメソッドが出てきませんでした。 ご教示お願いします。
YAmaGNZ

2020/01/05 00:38

どのように書いてどうなったのですか?
Zuishin

2020/01/05 00:44

TabPages は TabPageCollection ですが、IList<T> を実装していないので LINQ を使いたいなら OfType<T> や Cast<T> で変換する必要がありますね。
YAmaGNZ

2020/01/05 01:32

OfType<T>やCast<T>も実装はSystem.Linqにあるので、そういう意味でもLINQと書きました。 「Controls LINQ」と検索すればいろいろ例は出てくると思うのですが、検索しないんですかね?
退会済みユーザー

退会済みユーザー

2020/01/05 05:20

ご回答ありがとうございます。 適切な検索ワードで検索できてませんでした。ご教示いただいたワードで検索したところ、 tabControl.TabPages.Cast<Control>().Where ~ でLINQが使えることが確認できました。 また、質問の追記欄でZuishin様にご指摘、ご教示いただいたところ、そもそもの設計が間違っていることがわかりました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問