トップ回答者
BindingNavigatorToolBarについて

質問
-
おはようございます。
TableAdapterをデータソースからドラッグアンドドロップして自動的に生成されるツールバーに関してですが、
次のレコードへの移動や先頭への移動ができるようになっているのですが、これらのボタンをクリックしても
BindingContextのCurrentRowは変化しないのでしょうか。読み込んだDataSetのあるフィールドの値を用いて、ラジオボタンを操作しているのですが、本を参考に
以下のように記述をしたのですが、希望の動作にならなかったので悩んでおりました。Private Function GetCurrentDataRowView() As DataRowView
Dim m As BindingManagerBase = Me.BindingContext(Ds_table, "t_table")Return CType(m.Current, DataRowView)
End Functionそこで、上記のコードで取得したCurrentRowが移動ボタンにより、変化しているかを見たところ、変更がなかったので
Me.BindingContext(Ds_table, "t_table").Position += 1
以下の記述を移動ボタンのところに追加したところ、希望の動作を得ることができました。
ツールバーの移動ボタンをクリックしても、CurrentRowが変化しないのは使用でしょうか。
それとも私が何か勘違いをしているのでしょうか。
どうか、アドバイスをお願いします。
回答
-
TI-cb400 さん
> BindingContextのCurrentRowは変化しないのでしょうか。
はい、変化しません。
GetCurrentDataRowView メソッドを以下のように変更されれば、期待する結果になると思います。
(「テーブル名BindingSource」は、ドラッグドロップ操作で自動生成されているものです。)
Private Function GetCurrentDataRowView() As DataRowView
Dim m As CurrencyManager = テーブル名BindingSource.CurrencyManager
Return CType(m.Current, DataRowView)
End Function
以下説明です。
BindingContext を参照すると、指定したデータソースに対応する CurrencyManager のオブジェクトが得られます。BindingContext はコンテナ(今回はフォーム)ごとに管理されます。
(複数行をサポートしないデータソースの場合は CurrencyManager ではなく PropertyManager が戻されるため、BindingContext の戻り値は両者の基底クラスである BindingManagerBase になっています。)
CurrencyManager とは、現在行(Currency)を管理(Manager)するためのクラスです。
書かれたコードのように、Position プロパティ等を使って現在行を変更できたりします。
ただ、ほんの少し解りづらい仕組みであるため、Framework の 2.0 では、同じ目的にも利用でき、さらに便利な機能を持った BindingSource というクラスが追加されました。
自動生成された BindingNavigator での現在行の管理には、同じく自動生成される BindingSource が利用されます(BindingNavigator の BindingSource プロパティで指定済み)。
BindingSource でも内部的には CurrencyManager を使って現在の行が管理されているのですが、BindingContext を使って得られる CurrencyManager とは別のインスタンスになります。
つまり、現在行は、両者で別々に管理されています。
画面上の移動ボタンを押した結果は BindingSource に反映されますが、BindingContext の現在行には反映されません。
なお、CurrencyManager クラスにあるプロパティやメソッドは BindingSource クラスにも存在するため、上記コードのように CurrencyManager プロパティを経由しなくても、以下のように書くことができます(普通はこうします)。
Private Function GetCurrentDataRowView() As DataRowView
Return CType(テーブル名BindingSource.Current, DataRowView)
End Function- 回答としてマーク TI-cb400 2010年7月8日 18:17
すべての返信
-
そのように操作された場合、BindingSourceが自動的に生成され、それがBindingNavigatorなどのDataSourceに設定されます。したがって、
Dim m As BindingManagerBase = Me.BindingContext(Me.バインディングソース)
になります。
また、BindingSourceが使用されていますから、
BindingSource.Current
でも、CurrentのDataRowViewが得られます。
★良い回答には回答済みマークを付けよう! わんくま同盟 MVP - Visual C# http://blogs.wankuma.com/trapemiya/ -
TI-cb400 さん
> BindingContextのCurrentRowは変化しないのでしょうか。
はい、変化しません。
GetCurrentDataRowView メソッドを以下のように変更されれば、期待する結果になると思います。
(「テーブル名BindingSource」は、ドラッグドロップ操作で自動生成されているものです。)
Private Function GetCurrentDataRowView() As DataRowView
Dim m As CurrencyManager = テーブル名BindingSource.CurrencyManager
Return CType(m.Current, DataRowView)
End Function
以下説明です。
BindingContext を参照すると、指定したデータソースに対応する CurrencyManager のオブジェクトが得られます。BindingContext はコンテナ(今回はフォーム)ごとに管理されます。
(複数行をサポートしないデータソースの場合は CurrencyManager ではなく PropertyManager が戻されるため、BindingContext の戻り値は両者の基底クラスである BindingManagerBase になっています。)
CurrencyManager とは、現在行(Currency)を管理(Manager)するためのクラスです。
書かれたコードのように、Position プロパティ等を使って現在行を変更できたりします。
ただ、ほんの少し解りづらい仕組みであるため、Framework の 2.0 では、同じ目的にも利用でき、さらに便利な機能を持った BindingSource というクラスが追加されました。
自動生成された BindingNavigator での現在行の管理には、同じく自動生成される BindingSource が利用されます(BindingNavigator の BindingSource プロパティで指定済み)。
BindingSource でも内部的には CurrencyManager を使って現在の行が管理されているのですが、BindingContext を使って得られる CurrencyManager とは別のインスタンスになります。
つまり、現在行は、両者で別々に管理されています。
画面上の移動ボタンを押した結果は BindingSource に反映されますが、BindingContext の現在行には反映されません。
なお、CurrencyManager クラスにあるプロパティやメソッドは BindingSource クラスにも存在するため、上記コードのように CurrencyManager プロパティを経由しなくても、以下のように書くことができます(普通はこうします)。
Private Function GetCurrentDataRowView() As DataRowView
Return CType(テーブル名BindingSource.Current, DataRowView)
End Function- 回答としてマーク TI-cb400 2010年7月8日 18:17
-
ご返答が遅くなり、大変申し訳ございません。
まず、一番初めの私の質問の中にあるコードですが、VB2002の参考書に載っているコードを参考にしました。
ヘルプを見たときに、CurrencyManagerの記述を読んだのですが、よく理解ができず、上記の方法を採用していました。
最終的に、TH01様のご提示いただいたコードを利用し、イベントをBindingSource_PositionChangedを利用することで
現在、問題なく動作しております。少しずつですが、自分の希望する動作が実現するとプログラミングが楽しくなりますね。
また、困った時はよろしくお願いいたします。