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

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

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

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

Visual Studio

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

Q&A

解決済

2回答

1557閲覧

C#(Visualstudio)でボタンクリックイベントを別ファイルに記述したい、でもデザイナーから飛びたい

bifizmin

総合スコア3

C#

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

Visual Studio

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

0グッド

0クリップ

投稿2023/08/04 00:33

メインフォームにボタンがいっぱいあって、一つのソースファイルにクリックイベント
が大量にありクリックイベント以外のメソッドを探すのが大変です。

ボタンはある程度機能ごとのカテゴリがあるので、それごとにpartialでファイルを分割
してみましたが、今度はデザイナーからボタンをクリックしてイベントまで飛んでくれ
なくなってしまいます。

デザイナーの便利な機能を生かしつつ、ファイルを分割する良い方法はありませんか?

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

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

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

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

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

KOZ6.0

2023/08/04 03:53

どのようなものを作ろうとしているんでしょうか? たとえば電卓を作るとして、ボタンそれぞれにイベントハンドラを書くのは悪手です。 ひとまとめにして、何が押されたかは Text プロパティなどから判断して分岐したほうが良いです。 メニューであれば、ボタンの Tag プロパティに飛び先のフォーム名を入れておき、リフレクションを使ってアセンブリから該当するフォームクラスを呼び出して表示することもできます。
guest

回答2

0

今度はデザイナーからボタンをクリックしてイベントまで飛んでくれ
なくなってしまいます。

きちんと?ツリーの子に含めれば、該当ハンドラにジャンプしましたよ^^
Partialクラスのファイルを元クラスの子として表示 - Qiita

xml:.csproj

1<Compile Include="Form1.Hoge.cs" > 2 <DependentUpon>Form1.cs</DependentUpon> 3 <SubType>Code</SubType> 4</Compile>

隙あれば<SubType>Form</SubType>にしてくるのですが、どうやっても抑えられませんでしたorz
(直接コードを表示しようとするとデザイナが出て、「コードの表示」のひと手間が増える)


.NET(Core)でもできましたが、重複エラーになりますので↓としたほうがいいでしょう。

xml:.csproj

1<ItemGroup> 2 <Compile Update="Form1.Hoge.cs" DependentUpon="Form1.cs" SubType="Code" /> 3</ItemGroup>

NETSDK1022:重複する項目が含まれていました。 - .NET CLI | Microsoft Learn


Form1.csにぶら下がっているForm1.Hoge.csFuga.csには飛ぶ。
Form1.csにぶら下がってないPiyo.csには飛ばない。
証拠動画

投稿2023/08/04 03:40

編集2023/08/05 04:34
TN8001

総合スコア10049

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

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

TN8001

2023/08/04 03:40

UserControlに切り出すとか、大量にならないようにするほうがまっとうな気はしますが^^;
TN8001

2023/08/10 01:56

完璧なソリューションを提示したうえ、証拠動画まで取ったのに意味わかんねーな。もう近寄らんとこw
guest

0

ベストアンサー

クリックイベントが大量にありクリックイベント以外のメソッドを探すのが大変

というだけの話なのであれば,IDEの機能で所望のメソッドを探すとか,#region~#endregion で不必要な時にはイベント群のコードを折りたたむとかその程度で済ませておけば良いようにも思えますが.

あるいは,「カテゴリ」がボタン群の配置的にもまとまっているようであれば,カテゴリ毎のユーザコントロールに分ければどうでしょうか.


追記:
有用な場面は限られるかもしれませんが,以下のようにすれば「メソッドの数」を減らすことができるかもしれません.

C#

1public Form1() 2{ 3 InitializeComponent(); 4 5 //複数のボタンで同じハンドラを使う 6 this.button1.Click += this.button_Click; 7 this.button2.Click += this.button_Click; 8} 9 10//複数のボタンで使うハンドラ. 11//sender を見て処理を決める. 12//下記は if else でやっているが,実際の分岐方法はいろいろと考えられるかと. 13//(例えば,各ボタンの Tag にそれ用の何かを仕込んでおくとか?) 14// 15//分岐結果として Form1 の個別のメソッドを呼ぶような話になるのであれば「メソッド数を減らす」効果を得られないが, 16//例えばロジック処理を実装しているような別のやつの処理を呼ぶとかであれば,Form1 のメソッド数は減る. 17private void button_Click(object sender, EventArgs e) 18{ 19 if( sender == button1 ) 20 { MessageBox.Show( "1" ); } 21 else if( sender == button2 ) 22 { MessageBox.Show( "2" ); } 23 else 24 { MessageBox.Show( "Unknown" ); } 25}

投稿2023/08/04 01:12

編集2023/08/04 01:33
fana

総合スコア12179

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

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

bifizmin

2023/08/04 01:22

回答ありがとうございます。 その方法で使い心地をみてみたいと思います。
fana

2023/08/04 10:10 編集

ボタンのハンドラって大抵, private void button1_Click(object sender, EventArgs e){ DoWork1(); } private void button2_Click(object sender, EventArgs e){ DoWork2(); } みたく,単にやりたい処理を呼ぶだけになりませんか? (Formクラス内に処理を書く場合でも,同じ処理を他の操作(コンテキストメニューとか)からも呼びたくなることも多いので) どれだけ大量のボタンが存在するのかわかりませんが,こんな感じに各1行なら一か所(クラスのコードの末尾とか)に纏めておくだけでそれほど場所取りでもないような…? それでも邪魔なら,そのまとまりを #region~#endregion で挟んでおけば良いかと. (で,その後で追加したコントロールのイベントハンドラのコードがこの #endregion の後ろに追加されることに毎度イラっとするっていう…)
bifizmin

2023/08/10 00:05

この方法で進まることにします。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問