はじめに
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(); // 表示が「東京都」に更新される
DataSource を使っているときの挙動
DataSource でリストをバインドしている場合、
RefreshItems() はほとんど効果がありません。
理由
DataSource の場合は Items を直接操作していないため、
表示内容の更新は **データソースの再バインド** が必要だからです。
正しい更新方法
comboBox1.DataSource = null;
comboBox1.DataSource = myList; // バインドし直す
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 は ComboBox と ListControl 系コントロールで提供されているメソッドです。
- 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() を思い出してください。
特にオブジェクトを扱う場合には欠かせないメソッドです!

コメント