|
分類:[VB.NET/VB2005 以降]
はじめまして。
Tottyと申します。今回は宜しくお願い致します。
Windows7sp1(32bit)にてVisualStudio2008・VB.NETにて
フォームアプリケーションを作成しております。
フォーム上にデータベースから取得した値を
項目ごとにテキストボックスに表示し、データの変更が
あった場合は背景色を変更する処理を入れようと思ってますが、
バインド時のイベント発生でエラーが発生してしまいます。
===== ソースコード =====
Option Strict Off
Option Explicit On
Public Class Form1
Private _dt As DataTable
Private Sub Text_TextChanged(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs)
Dim dtRow As DataRow
With DirectCast(eventSender, TextBox)
dtRow = .DataBindings("text").DataSource.Rows(0) ←※ここでエラー
' 内容変更時、背景色変更
.BackColor = If(.Text = _
dtRow(.DataBindings("text").BindingMemberInfo.BindingField, _
DataRowVersion.Original).ToString, _
Color.White, _
Color.Yellow)
End With
・・・・
End Sub
Private Sub Form1_Load(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles MyBase.Load
_dt = New DataTable()
' イベントバンドラ登録
For Each tmpControl As Control In Me.Controls
Select Case True
Case TypeOf tmpControl Is TextBoxBase
With DirectCast(tmpControl, TextBoxBase)
.Visible = False
AddHandler .TextChanged, AddressOf Text_TextChanged
End With
End Select
Next
・・・・
End Sub
Private Sub Form1_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
da = New SqlDataAdapter([データを取得するクエリ], cn)
_dt.Clear()
da.Fill(_dt)
' テキストボックスとバインド
With TextBox1
.Visible = True
.DataBindings.Add("text", _
_dt, _
"fullname", _
True, _
DataSourceUpdateMode.Never) ←ここを呼び出し時に
End With
With TextBox2
.Visible = True
.DataBindings.Add("text", _
_dt, _
"address", _
True, _
DataSourceUpdateMode.Never)
End With
・・・・
End Sub
'***** 実験的にいれた部分
Private Sub Button1_Click(ByVal eventSender As System.Object, ByVal eventArgs As System.EventArgs) Handles Button1.Click
da = New SqlDataAdapter([他のデータを取得するクエリ], cn)
_dt.Clear()
da.Fill(_dt)
' テキストボックスと再バインド
With TextBox1
.DataBindings.Clear()
.Visible = False
.DataBindings.Add("text", _
_dt, _
"fullname", _
True, _
DataSourceUpdateMode.Never) ←Visible = Falseでもイベント発生
.Visible = True
End With
With TextBox2
.DataBindings.Clear()
.Visible = False
.DataBindings.Add("text", _
_dt, _
"address", _
True, _
DataSourceUpdateMode.Never)
.Visible = isAtVisible
End With
・・・・
End Sub
End Class
===== ソースコード =====
デバッグをしました所、TextBox1.DataBindings.Addが呼び出された時点では
バインドが完了していないようで、Text_TextChanged内で
DirectCast(eventSender, TextBox).DataBindings("text").DataSourceが
Nothingになっていました。
Visible = Trueでないとバインドが設定できないという話が
他のページにてありましたので、Visible = TrueをDataBindings.Addの後に
行ったところ、Text_TextChangedイベントがVisible = Trueにした時に
発生し、DirectCast(eventSender, TextBox).DataBindings("text").DataSourceも
ちゃんと設定されていました。ところが、「次のデータを表示」などのボタン
(Button1)を押下して、このまま続けて別のデータを取得し再バインドを
行うとVisible = FalseでもText_TextChangedイベントが発生し、
DirectCast(eventSender, TextBox).DataBindings("text").DataSourceが
Nothingになっていました。
バインドがVisible = Trueでないとできないということは
ないようですが、DataBindingsのDataSourceが取得できない時期が
まちまちの理由がわからず対処に困っております。
どなたか原因のおわかりになる方がいらっしゃいましたら
宜しくお願い致します。
|