私は にDataGridView
バインドしているBindingSource
を持っDataView
ていDataTable
ます。行が に追加されると、本来のようDataTable
に、変更がDataGridView
自動的に に表示されるようにします。標準的なもの。
DataTable
インスタンスを と同じフォームに配置するとDataGridView
、BindingSource
のListChanged
イベントが発生し、DataGridView
更新されます。しかしDataTable
、モジュールや別のフォームなど、他の場所に配置すると、フォームを最小化して復元しない限り、ListChanged
イベントは発生せず、DataGridView
自動的に更新されません。なんで?
アップデート
簡単なテストアプリでこれを行う方法の例を次に示します。
モジュール:
Imports System.ComponentModel
Module modTick
Private WithEvents tmr As System.Timers.Timer
Private r As New Random()
Public dt As DataTable
Public Sub Init()
dt = New DataTable("table")
dt.Columns.Add("Number")
dt.Rows.Add(New Object() {r.Next})
dt.Rows.Add(New Object() {r.Next})
dt.Rows.Add(New Object() {r.Next})
End Sub
Public Sub StartTimer()
tmr = New System.Timers.Timer()
tmr.AutoReset = True
tmr.Interval = 500
tmr.Enabled = True
End Sub
Private Sub _tmrPulse_Elapsed(ByVal sender As Object, ByVal e As System.Timers.ElapsedEventArgs) Handles tmr.Elapsed
dt.Rows.Add(New Object() {r.Next})
End Sub
End Module
フォーム:
Public Class Form1
Private dv As DataView
Private WithEvents bs As BindingSource = New BindingSource()
Private WithEvents tmr As Timer = New Timer()
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
modTick.Init()
dv = New DataView()
dv.Table = modTick.dt
dv.AllowDelete = False
dv.AllowEdit = False
dv.AllowNew = False
dgdisplay.AutoGenerateColumns = True
bs.DataSource = dv
dgdisplay.DataSource = bs
tmr.Interval = 500
tmr.Enabled = True
modTick.StartTimer()
End Sub
Private Sub tmr_Tick(ByVal sender As Object, ByVal e As System.EventArgs) Handles tmr.Tick
Label1.Text = bs.Count
End Sub
End Class
したがって、モジュールのコードをフォームに入れると、のイベントが発生DataGridView
するため、更新されます。そのままでは、起動も更新もされません。しかし、フォームを最小化して元に戻すと、変更が反映されます。は内のアイテムの数を示しており、これは正しいです。BindingSource
ListChanged
Label
DataTable