DOBON.NET DOBON.NETプログラミング掲示板過去ログ

ComboBoxの再描写

  • 題名: ComboBoxの再描写
  • 著者: さい
  • 日時: 2011/12/08 20:19:23
  • ID: 29450
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[C#、.NET 2.0]
分類:[.NET]

はじめまして。

ComboBoxの表示部分を再描写させるにはどうしたらよいでしょうか?

フォームにComboBox1とButton1があり、ComboBox1には以下のようなクラスが入っています。


class comboitem {
public string text { get; set; }
public string id { get; set; }

public comboitem(string _id, string _text) {
text = _text;
id = _id;
}
public override string ToString() {
return text;
}
}

Button1を押すと、このクラスのtextの部分を書き換えて、ComboBox1の表示切り替えたいと考えています。
ですが、ComboBox1.Refresh()を行っても、this.Refresh()を行っても、書き換えられません。

よろしくお願いします。
■No29450に返信(さいさんの記事)
> ComboBoxの表示部分を再描写させるにはどうしたらよいでしょうか?

そのアイテムをセットしなおしてやれば、表示も更新されます。
 comboitem a = (comboitem)this.comboBox1.Items[0];
 a.text = "New Text";
 this.comboBox1.Items[0] = a;

comboBox1.Items.Add ではなく、comboBox1.DataSource 経由で
表示させている場合は、データソース自体をセットしなおします。
 this.comboBox1.DataSource = null;  // 一時的に解除
 this.comboBox1.DataSource = 元データ;  //再セット


アイテムをセットしなおさずに更新するのであれば、
データが変更されたことをComboBox に通知する必要があります。

これにはたとえば、BindingSource を使う方法があります。
ComboBox の DataSource にこれを指定して
 // comboitem のコレクション;
 List<comboitem> list = new List<comboitem>();
    :
  this.bindingSource1.DataSource = list;
  this.comboBox1.DataSource = this.bindingSource1;
などとしておきます。

修正したことを通知するためには、
 list[0].text = newValue;
 bindingSource1.ResetItem(0);
などとしてやります。


あるいは comboitem で管理する代わりに、DataTable を使うのも良いでしょう。
DataTable の場合は、それ自体に変更通知機能が備わっています。
 DataTable tbl = new DataTable();
  :
  tbl.Columns.Add("id");
  tbl.Columns.Add("text");
  tbl.Rows.Add(…);
  tbl.Rows.Add(…);
  tbl.Rows.Add(…);
  :
  comboBox1.DataSource = tbl;
  comboBox1.DisplayMember = "text";

上記の場合、DataTable を直接
 tbl.Rows[0]["text"] = newValue;
などと編集すれば、即座に反映されます。


あるいは、自身が作成したコレクションに
変更通知を実装するという手もあります。
  • 題名: Re[2]: ComboBoxの再描写
  • 著者: さい
  • 日時: 2011/12/09 0:19:12
  • ID: 29453
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
魔界の仮面弁士さん

返事ありがとうございます。

Refreshなどで再描写されるものと思ってましたが、そうではないのですね。
勉強になりました。

実装はDataTableを使おうと思います。
ボタンによる言語切替でしたので、DisplayMemberに実装できるなら簡単ですので。

ありがとうございました。

DOBON.NET | プログラミング道 | プログラミング掲示板