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

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

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

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

1回答

2898閲覧

動的にPanelを作成し、Panelをクリックしたときの処理を書きたい。

_string

総合スコア15

C#

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

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2020/04/23 04:05

前提・実現したいこと

C#のWindows form applicationのスクリプトから、動的にPanelを作成し、Panelをクリックしたときの処理を書きたい。

発生している問題・エラーメッセージ

該当のソースコード

C#

1 2 private void Form1_Load(object sender, EventArgs e) 3 { 4 this.Width = Screen.PrimaryScreen.WorkingArea.Width; 5 this.Height = Screen.PrimaryScreen.WorkingArea.Height; 6 this.DesktopLocation = new Point(0, 0); 7 CreateMyPanel(); 8 } 9 public void CreateMyPanel() 10 { 11 panel1 = new Panel(); 12 13 panel1.Location = new Point(50, 50); 14 panel1.Size = new Size(Screen.PrimaryScreen.WorkingArea.Width - 100, Screen.PrimaryScreen.WorkingArea.Height - 100); 15 panel1.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D; 16 this.Controls.Add(panel1); 17   //panel1を使い、ここにクリックの処理を入れたい 18     }

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

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

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

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

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

Zuishin

2020/04/23 04:07

panel1.Click += まで書いてタブを押してください。
guest

回答1

0

ベストアンサー

普通にフォームデザイナでPanelを配置し、Clickイベント追加して保存して、生成された.Designer.csファイルを覗いてみてください。答えが載っています。

投稿2020/04/23 04:24

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2020/04/23 05:09

Panel は動的に生成するのだそうですが?
退会済みユーザー

退会済みユーザー

2020/04/23 05:12

デザイナーの出力コードも結局は動的にコントロールを生成しているので、デザイナーのコードを見ることで、Clickイベントの記述の仕方は理解できると思います。
退会済みユーザー

退会済みユーザー

2020/04/23 05:18

それは「静的」と言うのだと思います。 Zuishin さんのコメントがここの質問に対しては正解なのでは?
fana

2020/04/23 05:25

一旦,(仮)で(何なら適当に別のプロジェクトでも作って)デザイナにイベントハンドラ登録のためのコードを生成させてみれば,どう書けば良いかわかる(=参考にできるサンプルコードが作れる) →それを真似て,自前のpanel1にハンドラを登録するコードを書けばよい. という話でしょう.
退会済みユーザー

退会済みユーザー

2020/04/23 05:28 編集

質問者の方がどこで引っかかっているかが、クリックイベントの書き方が分からないところかなと思ったので、こうやって調べられますよという提案で書いた次第です。 そもそもSurferOnWwwさんと問答するために回答を書いた訳ではないので。
workaholist

2020/04/23 05:28

radianさんの方法でDesigner.csにはZuishinさんのいう「panel1.Click +=」が記述されるから同じ話では。
fana

2020/04/23 05:32

(+=まで書いてタブを押せばIDEが面倒を見てくれるということを今初めて知った私…… ナチュラルにこの回答の方法で書き方調べてました)
_string

2020/04/23 05:34

Clickイベントの記述の仕方が理解できました!radianさん!ありがとうございます"(-""-)" 先ほど「C# Panelをプログラムから作成する方法」と調べたとき、動的に作成します。 という風な文章がありましたので、動的というのはスクリプトからPanelを作成したり、Panel.Clickをコントロールしたりするという解釈として、質問をしてしまいました。すみません。
Zuishin

2020/04/23 05:55

用語がグダグダすぎて。
退会済みユーザー

退会済みユーザー

2020/04/23 06:05

質問に書いてあるコード、すなわち動的に Panel を Form に配置してから Click イベントにハンドラを設定するなら Zuishin さんのコメントのやり方(panel1.Click += まで書いてタブを押してください)一択のはずです。Designer.cs を見て考えるなどということは少なくとも自分的にはあり得ません。
退会済みユーザー

退会済みユーザー

2020/04/23 06:16

個人の見解になりますね、どうもお疲れ様です。 私は質問者さんが納得いく答えが得られたならばそれでいいです。
fana

2020/04/23 06:24 編集

逆方向の(残念な方向の)個人的見解も対比的に書いてみる. (1)イベントハンドラの戻り値ってどんなだっけ? たしかEventArgがどうの…? ← いつもデザイナに作ってもらってるからまともに覚えてないという (2)そもそも該当イベントのハンドラの名称(本件で言えば,"Click"である旨)がわからん ← いつもデザイナのプロパティからそれっぽいの探してるからやはりまともに覚えてない (3)既述の通り,タブでやれるのを知らない 私くらいの低能になるとここまで揃うので,InitializeComponent()を参照するという手はあり得る.
退会済みユーザー

退会済みユーザー

2020/04/23 06:37

だから、何も知らない人が Designer.cs を見て考えるなどということをしなくても済むように、Zuishin さんが質問の内容・コードに対しては十分な答えになっているコメントを書かれていると思うのですが? それに対してなぜ一言もフードバックを返さないのですか?>質問者さん
workaholist

2020/04/23 06:50

全ての人が自分と同じことを考えてるとは限らないし、自分の思い通りに動くこともないよ。
退会済みユーザー

退会済みユーザー

2020/04/23 06:56 編集

正しい方向に動かなければだめだよね? (結局は動的に Panel を作って配置する必要はなかったようですが、それは後で分かった話)
workaholist

2020/04/23 06:53

正しいって誰が決めたんですか?
Zuishin

2020/04/23 07:16

SurferOnWww さんありがとうございます。この質問者は私に対して何か思想を持っているのでしょう。他の人なら反応したんじゃないかと思います。 InitializeComponent を見るのも手だと思います。残念ながら WPF や UWP では使えませんが。 WPF では View 層でイベントを書くと警察に捕まりますが、UWP ではモバイルを視野に入れているためか、パフォーマンスを上げるためにイベントが推奨されていますね。 https://docs.microsoft.com/ja-jp/windows/uwp/debug-test-perf/mvvm-performance-tips > 推奨事項: 便利な ICommand インターフェイスを使用する代わりに、分離コードにイベント ハンドラーを配置し、ビュー イベントにイベント ハンドラーを接続することを検討して、それらのイベントが発生したときに、ビュー モデルでコマンドを呼び出します。 コマンドが利用できない場合、ボタンを無効にするコードを追加する必要があります。
Zuishin

2020/04/23 07:25

イベント名は私もちゃんと覚えていません。 実をいうと今回の方法で補完することも今ではめったにありません。 普段は panel1. まで書いて Alt+V でイベントを列挙し、その中から目的のものを探します。 見つけたら panel1.Click += (sender, args) => {}; とラムダ式で済ませてしまいます。 イベントの引数はこの二つにほぼ決まっているので。 あとは Observable.FromEventPattern(panel1, nameof(panel1.Click)) でしょうか。 イベントの追加・削除を書くオーバーロードの方がパフォーマンスが高いと人気のようですが、パフォーマンス面で言えばイベントを数千回つけ外しすることはないので無視できます。 追加・削除を書くのは、対象の寿命が短くメモリリークの可能性がある時ですね。この時はきっちり Dispose しないといけませんが、あまりそれをしなければいけないことは広まっていないように思います。
YAmaGNZ

2020/04/23 07:29

質問者さんが理解できるレベルかどうかは分かりませんが、Designer.csを見れば参考にできますということは間違いではないと思います。 Zuishinさんのコメントが一番の回答であることに違いはないとは思いますし、radianさんも別に否定してないでしょうに
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問