- ベストアンサー
VB DataRepeaterで条件を満たすデータを表示する方法
- Visual Studio 2008とXPの環境下で、DataRepeater(Form2)を使用してテーブルのデータを表示しています。さらに、追加ボタンをクリックするとその行のデータを追加できるようにしています(Form3)。しかし、データを追加して戻った場合、DataRepeaterは変更前の状態で表示されます。そこで、Form2が開くたびにフィルターがかかった状態で表示する方法を教えてください。
- 具体的な例として、テーブル「dd」のカラム「a」「b」「c」があります。カラム「a」は自動的にNoを振っています。Form2では、以下のように表示されています。「(Form3呼出ボタン) a 1 c」「(Form3呼出ボタン) a 2 c」。カラム「c」はまだ何も登録されていないため、空白です。Form3では、カラム「a」「b」「c」を入力し、「(登録ボタン)」を押してForm2に戻ります。しかし、戻った後も以前のForm2の状態が表示されてしまいます。結果として、Form2では「(Form3呼出ボタン) a 2 c」のみ表示したいです。
- フィルターの条件としては、カラム「c」がnullまたは空白であるか、0であるかのいずれかで判断したいです。このようなコーディング方法を教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
FILTER に設定する際の NULL 判定は以下のようにしてください。 BindingSource.Filter = "商品コード IS NULL" もしくは BindingSource.Filter = "LEN(商品コード) = 0" また更新した結果が FORM2 に反映されない理由は簡単です。 クラスと変数の守備範囲つまりスコープ の概念を理解する必要があります。 ■ Visual Basic 中学校 > 初級講座 >第8回 もっと変数 http://homepage1.nifty.com/rucio/main/dotnet/shokyu/standard8.htm 物理的に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/Database/Database4.htm 参考:■DataRow.BeginEdit メソッド http://www.weblio.jp/content/DataRow.BeginEdit+%E3%83%A1%E3%82%BD%E3%83%83%E3%83%89 最後にForm2 の TableAdapter のUpdate メソッドで 更新する。 なお、ほかにもいろいろやり方は考えられますが。 上記の案でいかがでしょうか?
その他の回答 (1)
- NOBNNN
- ベストアンサー率50% (93/186)
DataRepeater であろうがDataGridView でも どちらもおなじです。 1.BindingSourceクラス http://msdn.microsoft.com/ja-jp/library/system.windows.forms.bindingsource.filter.aspx 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(VS.80).aspx ==== 上記1が 回答に近いとは思いますけど。
お礼
毎回、お世話になっております。早々にありがとうございます。昨夜からチャレンジしているのですが思ったとおりの結果が出ません。おバカ度がばれてしまいそうですが・・・。 BindingSourceのプロパティーでfilterがあったので、そこへc=nullとしてもダメで、数値へ変更してみたのですがうまくいきません。今朝ももう少しチャレンジして再度ご連絡させていただきます。
補足
ありがとうございました。 数字でも判別ができるように(なぜなったか不明)なりました。 さらに質問なのですが、 ---------------<<Form3>> a 1 c か(←ここを入力) (登録ボタン) ※「(登録ボタン)」にてcの「か」を登録してform2に 戻るのですが、以前、上のform2の状態のままです。 結果としては <<Form2>> (form3呼出ボタン)a 2 c ------------------------- の部分で、以前リストアップされたままです。 これはテーブルの情報が更新されただけではダメで、親フォームの c部分も反映してなからダメって事でしょうか?
お礼
毎回、早々に沢山のご指導ありがとうございます。 チャレンジしてみます。しばしお時間を・・・。
補足
いい感じで更新もできてきたのですが、教えてください。 処理速度としてはForm3で登録するのと、Form2で登録するのとどちらが処理が早く後々の事を考えるとどちらがメンテしやすでしょうか? ご提案いただきました 「案1、データを読み込みしなおす。」ですが単純にForm3を開く際、Form2は閉じて、Form3からNewで呼び出したら更新されてるのかと思ったのですが、そう簡単ではなかったんですね・・・。 「FORM3の処理終えて Form2に戻ってきたときに 再度 DBデータを読み込みしなおす」方法を伝授していただけないでしょうか。