[C#][Windows Formsアプリ][ComboBox] RefreshItemsメソッドで表示中のアイテムを更新する

スポンサーリンク

はじめに

ComboBoxに追加したアイテムの「内部データが変更された」のに、
画面上の表示が更新されない…
そんなときに使うのが RefreshItems() メソッドです。

普段あまり使わないため知られていませんが、
特にオブジェクトを Items に入れている場合
ToString の表示内容を変えたい場合に欠かせない存在です。

 

RefreshItemsメソッドとは?

メソッド 説明
RefreshItems() Items に入っているオブジェクトの表示内容を再構築し、ComboBox を再描画する。
💡 ポイント

  • RefreshItems は Items を変更するのではなく、表示だけを更新するメソッド
  • 表示内容は ToString() の結果に基づいて再描画される
  • 内部値を変えても表示が変わらない場合に使用する

 

基本的なケース:オブジェクトの表示内容を変更したとき

ComboBox にカスタムオブジェクトを入れる場合、
表示内容は ToString() の結果に依存します。
しかし、オブジェクトのプロパティを変更しても、ComboBox はその変更に気づきません。

例:Item の名前を変更したのに画面が更新されない

public class City
{
    public string Name { get; set; }
    public override string ToString() => Name;
}

var tokyo = new City { Name = "東京" };
comboBox1.Items.Add(tokyo);

// 内部データ変更
tokyo.Name = "東京都";

// このままだと ComboBox の表示は「東京」のまま

ここで使うのが RefreshItems() です。

表示を更新する

comboBox1.RefreshItems();  // 表示が「東京都」に更新される
✔ つまり RefreshItems は「ToString の再評価」を強制しているイメージです。

 

DataSource を使っているときの挙動

DataSource でリストをバインドしている場合、
RefreshItems() はほとんど効果がありません。

理由

DataSource の場合は Items を直接操作していないため、
表示内容の更新は **データソースの再バインド** が必要だからです。

正しい更新方法

comboBox1.DataSource = null;
comboBox1.DataSource = myList; // バインドし直す
⚠ DataSource 使用時に RefreshItems() は基本的に使わない
→ Items モード専用と考えてOK

 

Add / Insert / Remove と RefreshItems の関係

操作 表示は自動更新される?
Items.Add() ✔ 自動更新される
Items.Insert() ✔ 自動更新される
Items.Remove() ✔ 自動更新される
アイテム内部の値を変更 ✘ 自動更新されない → RefreshItems() が必要!

RefreshItems の目的は「Items の中身ではなく、表示内容の再描画」にあるため、
Add や Remove のような操作では必要ありません。

 

実用例:チェックボックスで名前変更 → ComboBox も更新

ユーザー操作で値が変わったときに表示を更新するケースです。

private City selectedCity;

private void Form1_Load(object sender, EventArgs e)
{
    selectedCity = new City { Name = "横浜" };
    comboBox1.Items.Add(selectedCity);
}

private void checkBox1_CheckedChanged(object sender, EventArgs e)
{
    // 内部値の変更
    selectedCity.Name = checkBox1.Checked ? "横浜市" : "横浜";

    // ComboBox の表示更新
    comboBox1.RefreshItems();
}

ToString の表示がリアルタイムに反映されるようになります。

 

他のコントロールにも RefreshItems はある?

RefreshItems は ComboBoxListControl 系コントロールで提供されているメソッドです。

  • ComboBox
  • ListBox

内部値の変更を UI に反映させたい場合に同じように利用できます。

 

BeginUpdate / EndUpdate と併用することもできる

表示更新が多い場合は、描画停止を併用して効率を上げられます。

comboBox1.BeginUpdate();

try
{
    foreach (var city in cityList)
    {
        city.Name += "市";   // 内部値更新
    }

    comboBox1.RefreshItems();
}
finally
{
    comboBox1.EndUpdate();
}

大量の表示更新にも対応できます。

 

まとめ

  • RefreshItems() は Items の「表示だけ」を再描画するメソッド
  • 内部データが変わっても、自動では更新されないため手動で呼ぶ必要がある
  • オブジェクト + ToString() の表示値変更時に必須
  • DataSource 使用中は効果なし → 再バインドが必要
  • BeginUpdate / EndUpdate と併用すれば大量更新も高速にできる

表示内容と内部データのズレを防ぐために、
「表示を更新したい」と思ったら RefreshItems() を思い出してください。
特にオブジェクトを扱う場合には欠かせないメソッドです!

Please follow and like us:

コメント

タイトルとURLをコピーしました