ListBoxのDataSourceに設定した値を変更した際に表示を更新するには?

解決


clooch  2007-11-12 07:22:03  No: 144081

フォーム上にListBox lst1があります

'以下に書くコードは、普通にlst1に追加すれば解決するのでやる意味がありませんが・・・。
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  Dim data As New List(Of String)()
  data.Add("A")
  data.Add("B")

  lst1.DataSource = data

  data.Add("C")  ’これがフォーム上に反映されない
End Sub

このような場合、更新された値を反映させるにはどうすればいいのでしょうか?
lst1.DataSource = Nothing
lst1.DataSource = data
とすることで一応反映されますが、これではデータ数が多いと無駄に時間がかかってしまいます。

普通にlst1.Itemsを操作しているような感覚で再描画させることは出来ないのでしょうか?

どなたかご教授いただけないでしょうか。
よろしくお願いします。


魔界の仮面弁士  2007-11-12 08:32:11  No: 144082

「変更通知機能を持ったオブジェクト」を割り当ててください。

たとえば、List の代わりに DataTable を割り当てると良いでしょう。
これなら、データを変更すると、その結果が直接反映されます。
(ListBox 側では、DisplayMember プロパティに「列名」を設定しておきます)

もし、どうしても List を利用したいのだとすると、List 自体には、
内容の変更を外部に知らせる機能を持ちあわせていませんので、
変更があった事を、データコンシューマである ListBox に通知するための、
何らかの「中継者」が必要となります。

たとえば、中継者として BindingSource クラスを使うとすれば…。

Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
  'これはデザイン時に設定しておいても可
  ListBox1.DataSource = BindingSource1
  ListBox2.DataSource = BindingSource1

  data = New List(Of String)()
  data.Add("A")
  data.Add("B")

  'データは、ListBox に直接渡すのではなく、
  '「中継者」である BindingSource を介して渡すようにする。
  BindingSource1.DataSource = data
End Sub

Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  'データの登録や変更は、「中継者」を介して行う。
  BindingSource1.Add("C")
End Sub


clooch  2007-11-12 12:25:23  No: 144083

なるほど、DataTableを使って解決しました。
ありがとうございました。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加