C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: DataBindingsについて


(過去ログ 80 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■47577 / inTopicNo.1)  DataBindingsについて
  
□投稿者/ VB初心者 (10回)-(2010/03/08(Mon) 09:14:29)

分類:[.NET 全般] 

ボタン押下で、レコードを取得し、各TextBoxに表示させたいのでDataTableをテキストに連携させるようForm_Loadにて、

Private Sub Form_Load
Dt = new DataTable
=DataTableに行追加=

TxtHoge.DataBindings.Add("Text",Dt,"ColHoge")

End Sub

PrivateSub Button_Click
=レコード取得=
End Sub

としています。
ボタン押下でDataTableに取得したレコードは入っていることは確認できましたが、TextBoxには表示されません。

これをForm_Loadではなく、Button_ClickにてDataBindingすると表示されます。

Form_Loadで行うには必要な処理があるのでしょうか?
引用返信 編集キー/
■47587 / inTopicNo.2)  Re[1]: DataBindingsについて
□投稿者/ nori (89回)-(2010/03/08(Mon) 16:41:58)
Form_Loadで作成したDt(DataTable)をどこかで書き換えていませんか?
引用返信 編集キー/
■47588 / inTopicNo.3)  Re[2]: DataBindingsについて
□投稿者/ VB初心者 (11回)-(2010/03/08(Mon) 17:23:35)
No47587 (nori さん) に返信
> Form_Loadで作成したDt(DataTable)をどこかで書き換えていませんか?

Form_Loadで行っていることは

Cn.ConnectionString="Provider=・・・"
Cn.Open

Dt = New DataTable
With Dt.Columns
.Add("HogeA",GetType(String))
.Add("HogeB",GetType(String))
 ・
 ・
 ・
End With

TxtHogeA.DataBindings.Add("Text",Dt,"HogeA")
TxtHogeB.DataBindings.Add("Text",Dt,"HogeB")
のみです。


引用返信 編集キー/
■47593 / inTopicNo.4)  Re[3]: DataBindingsについて
□投稿者/ VB初心者 (12回)-(2010/03/09(Tue) 09:01:36)
試行錯誤しながら、いろいろと試してみたところ、データベースからデータを取得する処理を別のクラスでやっておりましたが、これを自クラス内で行うようにしたところ、正常に動作するようになりました。

なぜそのようなことが起こるのかはわかりませんが…

以下がDBアクセスクラスのコードです。
Public Class DBAccess
Public Function DBRead(Cmd as OleDb.OleDbCommand) As DataTable
Dim Da as New OleDb.OleDbDataAdapter
Dim Dt as New DataTable

Try
Da.Fill(Dt)
Catch ex as Exception
エラーメッセージ
Return Nothing
Finally
Da.Dispose
End Try

Return Dt

End Function
End Class
Private Sub Btn_Hoge1_Click
Dim clsDbAccess as New DBAccess
Dim myDt as New DataTable
Dim Cmd as New OleDb.OleDBCommand

Cmd.CommandString="Select…"
Cmd.Connenction = Cn

myDt = DBAccess.DBRead(Cmd)
End Sub
引用返信 編集キー/
■47595 / inTopicNo.5)  Re[4]: DataBindingsについて
□投稿者/ 魔界の仮面弁士 (1532回)-(2010/03/09(Tue) 10:28:36)
No47593 (VB初心者 さん) に返信
> データを取得する処理を別のクラスでやっておりましたが、
> これを自クラス内で行うようにしたところ、正常に動作するようになりました。

DataTable のデータを入れ替えるのではなく、
DataTable 自体を差し替えてはいたのではありませんか?


たとえば、Private dataTable1 As DataTable なフィールド変数に対して

 dataTable1 = CreateSampleDataTable1()
 TextBox1.DataBindings.Add("Text", dataTable1, "Foo")

 dataTable1 = CreateSampleDataTable2()
 TextBox2.DataBindings.Add("Text", dataTable1, "Foo")

というコードが実行された場合、どちらも [dataTable1] に
バインドされてはいますが、TextBox1 と TextBox2 とでは
異なるデータが参照されることになりますよね。
引用返信 編集キー/
■47614 / inTopicNo.6)  Re[5]: DataBindingsについて
□投稿者/ VB初心者 (13回)-(2010/03/09(Tue) 17:48:53)
No47595 (魔界の仮面弁士 さん) に返信
> ■No47593 (VB初心者 さん) に返信
>>データを取得する処理を別のクラスでやっておりましたが、
>>これを自クラス内で行うようにしたところ、正常に動作するようになりました。
>
> DataTable のデータを入れ替えるのではなく、
> DataTable 自体を差し替えてはいたのではありませんか?
>
>
> たとえば、Private dataTable1 As DataTable なフィールド変数に対して
>
>  dataTable1 = CreateSampleDataTable1()
>  TextBox1.DataBindings.Add("Text", dataTable1, "Foo")
>
>  dataTable1 = CreateSampleDataTable2()
>  TextBox2.DataBindings.Add("Text", dataTable1, "Foo")
>
> というコードが実行された場合、どちらも [dataTable1] に
> バインドされてはいますが、TextBox1 と TextBox2 とでは
> 異なるデータが参照されることになりますよね。


> 異なるデータが参照されることになりますよね。
そうなってしまうんですか?
もう少し分かりやすく教えていただくことはできないでしょうか?
大変申し訳ありません。
引用返信 編集キー/
■47622 / inTopicNo.7)  Re[6]: DataBindingsについて
□投稿者/ 魔界の仮面弁士 (1535回)-(2010/03/09(Tue) 19:44:10)
No47614 (VB初心者 さん) に返信
>> 異なるデータが参照されることになりますよね。
> そうなってしまうんですか?
そうならないようにするために、

 (案1) DataTable のインスタンスを使いまわす(別のインスタンスを生成しないようにする)。
 (案2) DataTable のインスタンスを作り直すたびに、データバインドをやり直す。
 (案3) 案2を楽にするために、BindingSource を通じてバインドするようにする。

などの対策が必要になるかと思います。

なお、先の
>>> Button_ClickにてDataBindingすると表示されます。
は、上記の 案2 に相当することになります。



> もう少し分かりやすく教えていただくことはできないでしょうか?
どの部分が分からなかったのかが見えていないので、どのように書けば
VB初心者さんにとって分かりやすいのか悩みますが…一応書いてみます。


-----
たとえば、フォーム上に Label1 と Label2 があり、それぞれに、
"AAA"、"BBB" の文字列が記述されていたとします。

そしてそこに、
  Sub Sample(ByVal lbl As Label)
   MsgBox( lbl.Text )
  End Sub
というメソッドがあったとしましょう。


このとき、適当なイベント(Click イベント等)にて
 Sample(Label1)
 Sample(Label2)
と呼び出すコードを書くと、メッセージボックスにて「AAA」、次いで「BBB」と表示される事は
わかりますよね。メソッド内では、引数 lbl が指し示している実態(Label1 や Label2 など)に応じて、
メッセージボックスに表示される対象が切り替わることになります。


では、この呼び出し部分に少し手を加えて、
 Dim x As Label
 x = Label1
 Sample(x)
 x = Label2
 Sample(x)
に変更した場合はどうでしょうか。
それでも結果は先ほどと変わらず、「AAA」「BBB」と表示されるはずです。

どちらも変数名は x ですし、データを表示させるコードも「Sample(x)」で同じなのですが、
メソッド呼び出し時に、それぞれの変数 x が参照している Label は『別のインスタンス』なので、
それらの呼び出し結果は、「AAA」「BBB」と異なる内容が表示されるわけです。



それを踏まえて、先ほどの

 dataTable1 = CreateSampleDataTable1()
 TextBox1.DataBindings.Add("Text", dataTable1, "Foo")

 dataTable1 = CreateSampleDataTable2()
 TextBox2.DataBindings.Add("Text", dataTable1, "Foo")

というコードをもう一度見てください。


どちらも変数名は dataTable1 ですし、.DataBindings.Add のコードも同一ですが、
変数 dataTable1 に格納されている DataTable というのは、それぞれ
CreateSampleDataTable1() から返されたインスタンス(仮に "α" と呼びます)と、
CreateSampleDataTable2() から返されたインスタンス(仮に "β" と呼びます)という
『別のインスタンス』です。そのため、表示されるデータも別物となります。
(TextBox1 にはαの内容が表示され、TextBox2 にはβの内容が表示されることになる)


もし、DataBindings した当時の dataTable1 のインスタンスを差し替えるのではなく、
常に同じインスタンスに対して、行データのみを
  OleDataAdapter.Fill
  DataTable.Rows.Add
  DataTable.ImportRow
  DataTable.Merge
などで操作するようにすれば、データがぶれてしまう事を避けられるかと思います。
引用返信 編集キー/
■47629 / inTopicNo.8)  Re[7]: DataBindingsについて
□投稿者/ VB初心者 (14回)-(2010/03/10(Wed) 09:12:21)
ご丁寧にありがとうございます。

Public Class Frm_Hoge
Private Dt as New DataTable

Private Sub Frm_Hoge_Load
Txt_Hoge.DataBindings.Add("Text",Dt,"Col1")
End Sub

End Class

とした場合、DataBindingsで参照しているのはDtではないのでしょうか?
Dtのインスタンスが何であれDtを見ているのだと認識していました…。
引用返信 編集キー/
■47631 / inTopicNo.9)  Re[8]: DataBindingsについて
□投稿者/ 魔界の仮面弁士 (1537回)-(2010/03/10(Wed) 10:39:40)
No47629 (VB初心者 さん) に返信
> Txt_Hoge.DataBindings.Add("Text",Dt,"Col1")
> とした場合、DataBindingsで参照しているのはDtではないのでしょうか?

Dt といえば Dt ですが、この場合には
 『自フォーム上の Dt という変数名』
を追跡しているわけではなく、
 『Add 時に変数 Dt で示されたインスタンス』
を参照しています。

Add メソッド側にとってみれば、第二引数では単に Dt のインスタンスを受け取っている
だけであり、指定された変数名が「Dt」かどうかまでは追跡しようが無いということです。


別の例で見てみます。下記は DataTable ではなく、他のコントロールをバインドさせる例です。

 Private txt As TextBox
 Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
  TextBox1.Text = "TextBox1"
  TextBox2.Text = "TextBox2"

  Label1.DataBindings.Add("Text", TextBox1, "Text")
  Label2.DataBindings.Add("Text", TextBox2, "Text")

  txt = TextBox1
  Label3.DataBindings.Add("Text", txt, "Text")
 End Sub


この場合、
  ・Label1.Text は、TextBox1.Text に追従して変化する。
  ・Label2.Text は、TextBox2.Text に追従して変化する。
  ・Label3.Text は、txt.Text (この場合は TextBox1) に追従して変化する。
という動作となります。

しかし、後から
 Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  txt = TextBox2
 End Sub
で txt の参照先を変更してみても、Lable3 のバインド先が TextBox1 から TextBox2 に変わるわけではありません。
あくまでも、.DataBindings.Add で指定したインスタンスが対象ということです。


もし、バインド先のインスタンスを変更する必要があるのなら、
 Private Sub Form1_Load(ByVal sender As Object, ByVal e As EventArgs) Handles MyBase.Load
  BindingSource1.DataSource = TextBox1
  Label4.DataBindings.Add("Text", BindingSource1, "Text")
 End Sub

 Private Sub Button1_Click(ByVal sender As Object, ByVal e As EventArgs) Handles Button1.Click
  BindingSource1.DataSource = TextBox2
 End Sub
のように、BindingSource などを中継させると良いでしょう。
引用返信 編集キー/
■47640 / inTopicNo.10)  Re[9]: DataBindingsについて
□投稿者/ VB初心者 (15回)-(2010/03/10(Wed) 13:31:53)
ありがとうございます。

だとしたら、なぜ外部クラスを呼び出した場合、Form_Loadではバインドされず、Btn_Hoge_Clickではバインドされたのでしょう…。

どちらで行ったとしても同じインスタンスになると思われるのですが…。
引用返信 編集キー/
■47643 / inTopicNo.11)  Re[10]: DataBindingsについて
□投稿者/ 魔界の仮面弁士 (1538回)-(2010/03/10(Wed) 14:26:06)
No47640 (VB初心者 さん) に返信
> Form_Loadではバインドされず、Btn_Hoge_Clickではバインドされたのでしょう…。

対象のコントロールが、TagControl (正確には TabPage)上に配置されていませんか?

http://bbs.wankuma.com/index.cgi?mode=al2&namber=10441&KLOG=23

引用返信 編集キー/
■47646 / inTopicNo.12)  Re[11]: DataBindingsについて
□投稿者/ VB初心者 (16回)-(2010/03/10(Wed) 15:24:21)
No47643 (魔界の仮面弁士 さん) に返信
> ■No47640 (VB初心者 さん) に返信
>>Form_Loadではバインドされず、Btn_Hoge_Clickではバインドされたのでしょう…。
>
> 対象のコントロールが、TagControl (正確には TabPage)上に配置されていませんか?
>
> http://bbs.wankuma.com/index.cgi?mode=al2&namber=10441&KLOG=23
>

TabPageは使っておりません。

関係があるか不明ですが、Panelに内包された状態にはあります。
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -