電子書籍の厳選無料作品が豊富!

環境:Visual Stadio 2008 XP データはAccessのmdb

DataRepeaterに関しての本やサイトが少ないので誰かおしえて下さい。
DataRepeater(Form2)にてテーブルのデータを表示しています。さらにボタンを追加してクリックするとその行のデータについて表示し追加でその行のデータを追加できるようにしています(Form3)。
しかし追加して戻った際、DataRepeaterは変更前の状態で表示されています。ここにフィルターをかけたいのですがこのフォーム(Form2)が開く都度、フィルターがかかった状態で表示したいのですが、コーディング方法を教えて下さい。
【例えば】
テーブルdd
a b c
1 あ
2 い
※aは自動でNoを振っている
<<Form2>>
(form3呼出ボタン)a 1 c
(form3呼出ボタン)a 2 c
※cは空白です(まだ何も登録してないから)
<<Form3>>
 a 1 c か(←ここを入力)
 (登録ボタン)
※「(登録ボタン)」にてcの「か」を登録してform2に
戻るのですが、以前、上のform2の状態のままです。
結果としては
<<Form2>>
(form3呼出ボタン)a 2 c
のみ表示して欲しいです。フィルターはcかnullかどうか
もしくは0かどうか?

というコーディング方法をおしえて下さい。

A 回答 (2件)

FILTER に設定する際の NULL 判定は以下のようにしてください。



BindingSource.Filter = "商品コード IS NULL"
もしくは
BindingSource.Filter = "LEN(商品コード) = 0"

また更新した結果が FORM2 に反映されない理由は簡単です。 
クラスと変数の守備範囲つまりスコープ の概念を理解する必要があります。

■ Visual Basic 中学校 > 初級講座 >第8回 もっと変数
http://homepage1.nifty.com/rucio/main/dotnet/sho …

物理的にFORM3 で入力した情報を DB に更新をかけたとしても FORM2 のデータはそのままです。

だから 更新結果を反映するコードの工夫が必要になります。

もし、現状で Form2 でDB更新処理(Update,delete,新規追加)を行っているのであれば

案1、データを読み込みしなおす。
 Form3を 開く際に  Form3.ShowDialog() で開き、Form3 の処理を終えるまで
 Form2 側の操作をさせないようにする。
 
 FORM3の処理終えて Form2に戻ってきたときに 再度 DBデータを読み込みしなおす。
 その際、フィルター処理などもリセットされるので 元に戻す必要があります。
 当然カーソル(行)も変わってしまいます。 
 
 
案2、1レコード(行:Row) ごとに更新を行わない。遅延更新で対応する。
   Form3 で直接的なDBを更新せず。Form2でDB更新するようにします。
   
   具体的には Form3 で入力、もしくは指示(削除、追加、更新)された結果を
   Form3から Form2に 結果1レコード(行:Row)を引き渡すようにして
   FORM2の DataSet の テーブルに対して作業を行うようにします。
   
   テーブルの RowState を手がかりにして指示(削除、追加、更新)を判定します。
      もしくは何らかの内部フラグを引き渡して 判定できるようにコードを工夫します。
      
   参考:■Visual Basic 中学校 >第4回 DataTableの利用
    http://homepage1.nifty.com/rucio/main/VBdotNet/D …
   
 

参考:■DataRow.BeginEdit メソッド
http://www.weblio.jp/content/DataRow.BeginEdit+% …


 最後にForm2 の TableAdapter のUpdate メソッドで 更新する。
 


なお、ほかにもいろいろやり方は考えられますが。 上記の案でいかがでしょうか?

この回答への補足

いい感じで更新もできてきたのですが、教えてください。
処理速度としてはForm3で登録するのと、Form2で登録するのとどちらが処理が早く後々の事を考えるとどちらがメンテしやすでしょうか?

ご提案いただきました
「案1、データを読み込みしなおす。」ですが単純にForm3を開く際、Form2は閉じて、Form3からNewで呼び出したら更新されてるのかと思ったのですが、そう簡単ではなかったんですね・・・。

「FORM3の処理終えて Form2に戻ってきたときに 再度 DBデータを読み込みしなおす」方法を伝授していただけないでしょうか。

補足日時:2010/01/18 11:13
    • good
    • 0
この回答へのお礼

毎回、早々に沢山のご指導ありがとうございます。
チャレンジしてみます。しばしお時間を・・・。

お礼日時:2010/01/18 08:19

DataRepeater であろうがDataGridView でも どちらもおなじです。



1.BindingSourceクラス
http://msdn.microsoft.com/ja-jp/library/system.w …

  DataRepeater の 上に載せているものが DBなどの項目であった場合

  BindingSource のコントロールを使ってフィルターができます。

  BindingSource.Filter = "商品コード = 'A0003'"  という具合です。


2.DATaVIEW クラスを使ってフィルター

   Dim dv As DataView
dv = New DataView(Me.TESTDataSet.売上テーブル, "商品コード = 'A003'", _
"商品コード ASC", DataViewRowState.CurrentRows)

3.DataTable クラスを使ってフィルター
http://msdn.microsoft.com/ja-jp/library/det4aw50 …

====

  上記1が 回答に近いとは思いますけど。

この回答への補足

ありがとうございました。
数字でも判別ができるように(なぜなったか不明)なりました。

さらに質問なのですが、
---------------<<Form3>>
 a 1 c か(←ここを入力)
 (登録ボタン)
※「(登録ボタン)」にてcの「か」を登録してform2に
戻るのですが、以前、上のform2の状態のままです。
結果としては
<<Form2>>
(form3呼出ボタン)a 2 c
-------------------------
の部分で、以前リストアップされたままです。
これはテーブルの情報が更新されただけではダメで、親フォームの
c部分も反映してなからダメって事でしょうか?

補足日時:2010/01/14 11:27
    • good
    • 0
この回答へのお礼

毎回、お世話になっております。早々にありがとうございます。昨夜からチャレンジしているのですが思ったとおりの結果が出ません。おバカ度がばれてしまいそうですが・・・。
BindingSourceのプロパティーでfilterがあったので、そこへc=nullとしてもダメで、数値へ変更してみたのですがうまくいきません。今朝ももう少しチャレンジして再度ご連絡させていただきます。

お礼日時:2010/01/14 08:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!