読者です 読者をやめる 読者になる 読者になる

C# イベント & フォーム 基本編

ufcpp.net

 

using System;
using System.Drawing;
using System.Windows.Forms;

class Program
{
  static void Main()
  {
    Application.Run(new Form());
  }
}
コンソールアプリケーションから入力すると、
using System.Drawing;
using System.Windows.Forms;

に赤線で動かせない。


ウィンドウズフォームアプリケーション なら問題なく動く。

原因は、

「ライブラリ」が参照されてない

参照設定→追加→.net
using System.Drawing; → System.Drawing
using System.Windows.Forms; →System.Windows.Forms.dll

okwave.jp

okwave.jp


どうやら
ウィンドウズフォームアプリケーション でプロジェクトを作った場合。
テンプレート的にライブラリを自動追加して設定してくれているみたい。

Java で swing 触った時も
基本的には
ライブラリ呼び出す→プロパティ設定→出力

みたいな流れだったので、今回はそこからいくべし。

本来のイベント + イベントハンドラーの実装手順は

イベントハンドラー
→イベント発生時に実行されるメソッド

非常に参考になる

detail.chiebukuro.yahoo.co.jp



コントロール作成 butto1 = new Buttone();

コントロールのプロパティを設定 button1.Location = new Point(10, 10)

イベントハンドラの作成
button1.Click += new EventHandler(Button1_Click)


        void Button1_Click(object sender, EventArgs e)
        {
            this.count++;
            this.button1.Text = this.count.ToString();
        }

コントロールをフォームに追加

Contorols.Add(button1);

void Button1_Click(object sender, EventArgs e)

sender →イベントの発生元のオブジェクトが入っている

今回の場合だと
object sender → Buttonクラスのオブジェクト
EventArgs e →クリックの情報など


sender の設定次第では
で複数のボタンでも クリックされたボタンのオブジェクトを取得することも可能。

前に挑んだ電卓で見たなこれ

qiita.com

仮に
private void button1_Click(object sender, EventArgs e)
{
Button btn = (Button)sender;
}
であれば、
Button btn にはボタンの実体が入る。

にしてもこれ
引数 とか 基本的なルール知らないとどうにもならないなー

疑問は ()sender なんだが?

参考

[c#]複数のコントロールで共通のイベントハンドラを呼び出すには

 
        // senderをButton型として扱う
        btn = (Button)sender;


イベント ハンドラーの概要 (Windows フォーム)

公式では

private void button1_Click(object sender, System.EventArgs e) 
{

}
イベントハンドラー とは イベントに関連付けられたメソッド

上記の例は Button コントロール の Click イベントの
イベントハンドラ

概要図は

Button コントロール
|_Click イベント
 |_Click-(イベントハンドラー)かな?

objeck sender
はsender イベントを発生させたオブジェクトへの参照を提供

EventArgs e
では処理されるイベント今回で言えばClick イベント用のオブジェクトをわたす

イベントの概要