フォーム上に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を操作しているような感覚で再描画させることは出来ないのでしょうか?
どなたかご教授いただけないでしょうか。
よろしくお願いします。
「変更通知機能を持ったオブジェクト」を割り当ててください。
たとえば、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
なるほど、DataTableを使って解決しました。
ありがとうございました。
ツイート | ![]() |