【学習】WinForms でリストの気持ちをつなぐ(Label と Button だけ)
コンソールまでで、Player と List と foreach のイメージができたら、次は 画面に載せたい という気持ちが自然に出ます。
しかしいきなり ListBox やデータバインディングに入ると、「UI の話」と「データの話」が同時に来る ことがあります。
今回は 新しいコントロールを増やさず、WinForms 入門で既に出てくる Label と Button だけで、List<Player> をフィールドに持ち、クリックで一覧の内容を更新します。
前提
次の記事を読んでいる想定です。
今日作るもの
- フォーム上の Label に、複数プレイヤーの HP 状況を表示する
- Button を押すと全員に少しダメージが入り、表示が更新される
ListBox はまだ使いません。データはコード側の List<Player> が正 で、Label は「その写しを文字で見せる」役です。
ソリューションとプロジェクトを作る
- テンプレート: Windows Forms アプリ(.NET Framework でも Windows Forms でも可。学校の環境に合わせてください)
- プロジェクト名:
ListBridgeWinForms(任意)
フォームに配置するコントロール
| コントロール | 名前(例) |
|---|---|
| Label | statusLabel |
| Button | damageButton |
statusLabel の AutoSize を false にし、幅を広めに取ると複数行が見やすいです。
フォームに List を持たせる
Form1.cs の先頭付近に using System.Collections.Generic; を追加します。
Form1 のクラスに フィールド を追加します。
private List<Player> players = new List<Player>();
Player クラスは別ファイルでも Form1.cs の下でも構いません。授業では 同じ名前空間 に置けば動きます。
public class Player
{
public string Name;
public int Hp;
public Player(string name, int hp)
{
Name = name;
Hp = hp;
}
}
(シリーズ第1回〜と同じく フィールド+コンストラクタ にしています。プロパティ版に置き換えても構いません。)
ロード時に List を初期化する
Form1 のコンストラクタまたは Load イベントで players に追加します。
public Form1()
{
InitializeComponent();
players.Add(new Player("勇者A", 100));
players.Add(new Player("勇者B", 90));
players.Add(new Player("勇者C", 80));
RefreshStatusLabel();
}
RefreshStatusLabel は次のように foreach で文字列を組み立てる メソッドです。
private void RefreshStatusLabel()
{
var lines = new System.Text.StringBuilder();
foreach (Player p in players)
{
lines.AppendLine($"{p.Name} HP={p.Hp}");
}
statusLabel.Text = lines.ToString();
}
Button のクリックで全員にダメージ
private void damageButton_Click(object sender, EventArgs e)
{
foreach (Player p in players)
{
p.Hp -= 10;
}
RefreshStatusLabel();
}
プログラムの流れ
フォームが持つ List<Player> がデータの本体
↓
Label は「人間が読むための表示」
↓
Button イベントで List の中身を変更 → 表示を更新
重要ポイント
- 一覧 UI(ListBox)の前段階 として、「List をフィールドで持つ」感覚を固めるのが目的です
- 表示は 文字を連結して1つの Label に出す だけでも、授業や個人学習には十分使えます
- 次のステップとして、一覧・選択・追加まで進むなら WinForms で作る電話帳アプリ(List で管理する版) がそのまま続きになります



ディスカッション
コメント一覧
まだ、コメントがありません