C# object senderの上手の活用方法

タグの編集
投稿者 ケンケン  (社会人) 投稿日時 2023/12/22 11:50:22
private void AmountBtn_Click(object sender, EventArgs e)
{
                           割愛
                }
                    イベントを作成した時、パラメータの箇所に(object sender, EventArgs e)
       が表示されますが、object senderの上手の活用方法があれば、ご教授お願いします。
                 ※ 自分なりに活用した事な無い者です。
         

 
投稿者 とくま  (社会人) 投稿日時 2023/12/22 13:21:39
上手も何も、イベント関数も関数なのだから、
対象だけ違って同じ処理をまとめられるというだけでは?
関数は流石に使ったことあるのでは?
異なる対象を引数で渡すように作りませんでしたか?
それと特別変わらないと思います。

複数の同じ種類のコントロールに同じ処理を適用したい
という必要性が無いと、使わないものでしょう。

ドラックアンドドロップの処理を追加するとか、
ファイルを複数指定するときに、すべてのテキストボックスを
ファイルを開くダイアログと連携させるとか。
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2023/12/22 15:15:49
質問の意図としては「sender の使用例を知りたい」ということでよろしいでしょうか。
では実験的に、【三目並べ】ゲームの雛形を作ってみましょう。

Windows Forms において、フォームに TableLayoutPanel を貼り、
TableLayoutPanel1 のプロパティを
 ・ RowCount = 3
 ・ ColumnCount = 3
 ・ CellBorderStyle = OutsetDouble
に設定します。

3 行 3 列のマス目ができるので、それぞれのセルに Label を貼っていきます。

そしてデザイン時に、Ctrl/Shift のいずれかを押しながら、それらのラベルを順にクリックして、
9 つのラベルだけが選択された状態にしたうえで、それらすべてに対して
 ・Anchor プロパティを Top, Bottom, Left, Right に変更
 ・TextAlign プロパティを MiddleCenter に変更
 ・Text プロパティを、" " (全角空白) にしておく
と設定していきます。

さらに、9 つのラベルすべてが選択された状態でプロパティの⚡アイコンを押して
イベント一覧に切り替え、Click イベントの欄に「labels_Click」と記述します。

そうすると、”private void labels_Click(object sender, EventArgs e)” が生成され、
その一つのイベントハンドラに対して、9 つの Label が割り当てられた状態になります。

イベント引数 sender に、クリックされたラベルが渡されるので、
イベントハンドラを 9 つ用意せずとも、一つのイベントハンドラを共通利用できるわけです。

// 現在のターン数
private int turnCount = 0;

// クリックするごとに、○と×を交互に配置していく
private void labels_Click(object sender, EventArgs e)
{
    // ★ sender はクリックされた Label を表している ★ 
    var lbl = (Label)sender;

    // ○×がセット済みなら抜ける
    if (lbl.Text == "×" || lbl.Text == "○") { return; }

    // ターン数を増やす
    turnCount++;

    // 先手なら○、後手なら×を表示 
    lbl.Text = "×○"[turnCount % 2].ToString();

    // 何行目何列目のボタンが押されたのかを
    // 確認するため、タイトルバーにセル番号を記述
    var pos = tableLayoutPanel1.GetCellPosition(lbl);
    this.Text = "Click:" + pos.Column + ", " + pos.Row;

    // 余力があれば、ここに三目並べの勝敗判定を記述していく
    /*
    ** ・縦横斜めのいずれかが揃っていれば、勝敗表示をしてゲーム終了処理
    ** ・揃っていなくて turnCount が 9 に達していれば、引き分け処理
    ** ・揃っていなくて turnCount が 9 未満なら、何もせずそのままゲーム継続
    */
}
投稿者 ケンケン  (社会人) 投稿日時 2023/12/22 16:52:02
回答ありがとうございます。
色々と参考にさせていただきます。