C# object senderの上手の活用方法 への返答
投稿で使用できる特殊コードの説明。(別タブで開きます。)
以下の返答は逆順(新しい順)に並んでいます。
投稿者 魔界の仮面弁士  (社会人)
投稿日時
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 つ用意せずとも、一つのイベントハンドラを共通利用できるわけです。
では実験的に、【三目並べ】ゲームの雛形を作ってみましょう。
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 13:21:39
上手も何も、イベント関数も関数なのだから、
対象だけ違って同じ処理をまとめられるというだけでは?
関数は流石に使ったことあるのでは?
異なる対象を引数で渡すように作りませんでしたか?
それと特別変わらないと思います。
複数の同じ種類のコントロールに同じ処理を適用したい
という必要性が無いと、使わないものでしょう。
ドラックアンドドロップの処理を追加するとか、
ファイルを複数指定するときに、すべてのテキストボックスを
ファイルを開くダイアログと連携させるとか。
対象だけ違って同じ処理をまとめられるというだけでは?
関数は流石に使ったことあるのでは?
異なる対象を引数で渡すように作りませんでしたか?
それと特別変わらないと思います。
複数の同じ種類のコントロールに同じ処理を適用したい
という必要性が無いと、使わないものでしょう。
ドラックアンドドロップの処理を追加するとか、
ファイルを複数指定するときに、すべてのテキストボックスを
ファイルを開くダイアログと連携させるとか。
投稿者 ケンケン  (社会人)
投稿日時
2023/12/22 11:50:22
private void AmountBtn_Click(object sender, EventArgs e)
{
割愛
}
イベントを作成した時、パラメータの箇所に(object sender, EventArgs e)
が表示されますが、object senderの上手の活用方法があれば、ご教授お願いします。
※ 自分なりに活用した事な無い者です。
{
割愛
}
イベントを作成した時、パラメータの箇所に(object sender, EventArgs e)
が表示されますが、object senderの上手の活用方法があれば、ご教授お願いします。
※ 自分なりに活用した事な無い者です。
色々と参考にさせていただきます。