掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
DataRepeaterに関して (ID:147954)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
DataRepeater を使わない状態で、フォーム上のテキストボックスに対して、 TextBox1.DataBindings.Add("Text", dtTable, "品目名称") のようにすると、TextBox1.Text に対してデータが表示されますよね。 このデータテーブルをさらに、フォーム上の DataGridView に対して、 DataGridView1.DataSource = dtTable のようにすると、データテーブルの中身が DataGridView に表示されます。 TextBox は複数レコードを表示できませんが、DataGridView 側で 選択行を変えると、TextBox 側の表示も、その行の内容に差し替わります。 さらに DataRepeater も併用している場合は、DataGridView の選択行と DataRepeater の選択行と、フォーム上の TextBox が表示している行とが、 それぞれ連動することになります。 ここまではよろしいでしょうか。 さて、そうすると ・DataGridView や DataRepeater 無しで TextBox だけの場合、 どうやって『現在の行』を移動させればよいのか? ・DataRepeater 等で、『現在の行』を調べるにはどうすれば良いのか? といった問題が生じてくるかと思います。 実は、この「現在の行」を管理するためのオブジェクトが存在しています。 そしてそのオブジェクトには、 Dim man As BindingManagerBase = TextBox1.BindingContext(oDataTable) のようにしてアクセスできます。このオブジェクトが肝となります。 DataGridView や DataRepeater でも、同様にして管理オブジェクトを 取得できますし、フォームからも Dim man As CurrencyManager = Me.BindingContext(oDataTable) として取得できます。(CurrencyManager は BindingManagerBase を継承しています) このオブジェクトには .Position プロパティがあり、これが現在の行番号(0 以上)を示しています。 このプロパティを変更すれば、現在見ているレコードも変更されるという寸法です。 (DataRepeater の CurrentItemIndex プロパティと同じ機能です) また、BindingManagerBase の .Current プロパティからは DataRowView クラスが返されるので、 Dim rowView As DataRowView = DirectCast(man.Current, DataRowView) Dim row As DataRow = rowView.Row のようにして、バインド元の DataRow にアクセスすることもできます。 これを使う事で、DataRepeater 等でのカレント行の取得が可能になります。 ---------------------- また、shu さんが紹介された BindingSource は、この管理情報を内包した中継器に当たります。 ツールバーから、BindingSource をフォームに貼り、BindingSource1 を 用意しておきます。そして、データバインドの設定を DataGridView1.DataSource = dtTable TextBox1.DataBindings.Add("Text", dtTable , "品目番号") TextBox2.DataBindings.Add("Text", dtTable , "品目名称") DataRepeater1.DataSource = dtTable から、以下のように変更します。 BindingSource1.DataSource = dtTable DataGridView1.DataSource = BindingSource1 TextBox1.DataBindings.Add("Text", BindingSource1, "品目番号") TextBox2.DataBindings.Add("Text", BindingSource1, "品目名称") DataRepeater1.DataSource = BindingSource1 対象コントロール(データコンシューマー)と DataSet/DataTable の間に、 BindingSource が中継される形となりますが、こうすると、『現在行』の管理を この BindingSource のメンバーを通じて行えるようになります。 BindingSource を経由される事には、幾つかの利点があります。 一つは、「現在の行」にアクセスするのが簡単になるという点。 BindingSource があれば、わざわざ BindingManagerBase を再取得せずとも、 BindingSource1.Position プロパティ BindingSource1.Current プロパティ BindingSource1.MoveFirst() / .MoveNext() / .MovePrevious() / .MoveLast() メソッド BindingSource1.AddNew() メソッド などを利用できるため、現在行の管理が容易になります。 (BindingSource1.CurrencyManager から、BindingManagerBase を得ることもできます) もう一つは、フィルタリングやソート機能を有している点。 BindingSource1.Filter = "品目名称 LIKE '%ab%'" BindingSource1.Sort = "品目番号 DESC" のようにして、SQL の WHERE や ORDER BY 相当の実装が行えます。DataView にも同じ機能がありますね。 (DataTable を直接割り当てた場合は、dtTable.DefaultView から既定の DataView を得られます) さらにもう一つ。DataSet/DataTable のインスタンスを作り直した場合に 再バインドするのが容易になるというメリットもあります。 もし、元の様に DataSet/DataTable に直接バインドさせていた場合、 DataSet/DataTable そのものを作り直したような場合においては、 (DataTable の中身を入れ替えるのではなく、インスタンス自体を再生成する場合) DataGridView1.DataSource = oDataTable DataRepeater1.DataSource = oDataTable などのように、個々のコントロールのバインド(DataSource/DataBindings)を やり直さなければなりませんが、BindingSource を中継させていれば、 BindingSource1.DataSource = oDataTable という一行を再実行するだけで済むわけです。個々のコントロールは BindingSource1 を参照したままなので、再設定は不要となります。
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.