DataGridViewの中身を検索

タグの編集
投稿者 名もない初心者  (中学生) 投稿日時 2009/2/1 20:30:39
VB歴五ヶ月の超初心者です。
今、csvを使って本を管理するソフトを作っています。
そこで、検索機能を付けたいのですが、コードが全く分かりません。
本は3冊ぐらい持っているのですが、mdb形式を使ったものしか載っていません。

・やりたいこと。
一覧表示用のDataGridViewから、TextBoxに入力された文字を含む書籍名を検索。(クリックイベントにしたい)
検索結果を検索結果用のDataGridViewに表示させたい。

以上です。
VBのバージョンは2005です。
DataGridViewの中身の並び方?は一覧表示用、検索結果用共に、左から書籍名、巻数、備考となっています。
データベース名は、一覧表示用はBookDataSetで、検索結果用は、SearchDataSetです。
DataGridView名は一覧表示用はDgvで、検索結果用は,Dgv2です。
検索文字を指定するTextBoxはSearchTextBoxです。
Dgv及び、Dgv2はそれぞれデータソースでBookDataSetとSearchDataSetを割り当てています。

これで伝わるでしょうか?
お願いします。
投稿者 かずき  (社会人) 投稿日時 2009/2/1 21:01:41
DataSet(型付かな?)をDataGridViewに表示ということなので
DataGridViewにBindingSourceを関連付け、BindingSourceに
DataSetを関連付けるような形になってると思います。

上記のような構成の場合、BindingSourceのFilterプロパティを使うと
表示データの絞込みが実現できます。

検索ボタンが押されたときの処理とかに
bindingSource1.Filter = "書籍名 like '%" & textBox1.Text & "%'"

のように書けばOKです。
投稿者 名もない初心者  (中学生) 投稿日時 2009/2/3 01:15:50
検索ボタンに
Dim Search As SearchDataTableBindingSourc
        Search.Filter = "書籍名 like '%" & SearchTextBox.Text & "%'"

と書いたら、「型'SearchDataTableBindingSourc'が定義されていません」とエラーになってしまいました。どうすれば・・・
投稿者 刈谷勇  (社会人) 投稿日時 2009/2/3 01:36:06
SearchDataTableBindingSourcはご自分で作られたクラスですか?
上の流れからすると、BindingSourceだと思うのですが・・・?
投稿者 名もない初心者  (中学生) 投稿日時 2009/2/3 02:20:13
はい。BindingSourceです。
投稿者 名もない初心者  (社会人) 投稿日時 2009/2/3 02:46:57
Dim Search As BindingSource = SearchDataTableBindingSource

と書いたら出来ました。
投稿者 名もない初心者  (中学生) 投稿日時 2009/2/3 03:07:42
エラーが無くなったので
Dim Search As BindingSource = SearchDataTableBindingSource
        Search.Filter = "書籍名 like '%" & SearchTextBox.Text & "%'"
        MessageBox.Show(Search.Filter)

と書いて、とりあえずテストでメッセージボックスに検索結果を出させるためにデバッグしたら、そんな書籍名は登録されてないのに、書籍名 like '%TextBoxに入力された文字%'になってしまいます。
なんかイメージと違う・・・
そもそも、Filterてどんな処理をさせるものなんですか?
投稿者 かずき  (社会人) 投稿日時 2009/2/3 06:25:19
SearchDataTableBindingSourceは、DataGridViewのDataSourceに指定してますか?
そしたらSearchDataTableBindingSource.Filter = "検索条件"とするだけで
DataGridViewに絞り込まれた結果が表示されると思います。

この動きがあなた(名前がないので出来ればちゃんとつけてもらえると個人的には嬉しいです)の
望む動きじゃないなら、どういう動きを望んでいるのか教えてください。
投稿者 かずき  (社会人) 投稿日時 2009/2/3 06:37:38
連続での投稿申し訳ありません。

もし、検索して絞り込んだ結果に対して何かをしたいということでしたら
BindingSource自体をFor EachでまわすとDataRowViewを取得出来るので
それを使うといいかも。
投稿者 neptune  (社会人) 投稿日時 2009/2/3 07:03:26
こんにちは

今どこまで出来ているかを書きましょう。
全くの第3者が見ても判るように。
出来れば、再現できる最低限のソース付きで。

現状では、どこまでわかってどこから判らないかが全く判りません。


もしかして、Form上にコントロールを並べただけの状態?
なら、
「データベース講座」
http://homepage1.nifty.com/rucio/main/VBdotNet/Database/index_db.htm
を先ず、読んで下さい。mdbもcsvも基本は同じですから。
投稿者 名もない初心者  (中学生) 投稿日時 2009/2/5 01:40:58
データーベース開発の本を買ってきて、載っていたので
Dim BookName As String
        Bookname = SearchTextBox.Text
        Dim foundIndex As Integer
        foundIndex = BookDataTableBindingSource.Find("書籍名", BookName)
        If foundIndex < 0 Then
            MessageBox.Show("該当するデータがありません。")
        Else
            BookDataTableBindingSource.Position = foundIndex
        End If
    End Sub

と、書いたら出来ました。(書籍名を完璧に入力しないとだめですが・・・)
Filterプロパティを使った処理もやってみたんですが、うまくできませんでした。
投稿者 かずき  (社会人) 投稿日時 2009/2/5 22:03:51
もしかして、検索って最初に一致した行を選択状態にしたいってことですか?
Filterを使う方法は、検索条件にひかっかったデータだけ表示するのに
使えます。

あと、どういう風な検索機能を作りたいということと、あなたが
どのようにアプリケーション作っているのか教えていただかないと
アドバイスしずらいです...
投稿者 名もない初心者  (中学生) 投稿日時 2009/2/7 03:52:06
>もしかして、検索って最初に一致した行を選択状態にしたいってことですか?
いいえ、表示されるだけでいいんです。
Filterがうまく出来なかったというのは、
検索ボタンのクリックイベント
Dim BookName As String
BookName = SearchTextBox.Text
BookDataTableBindingSource.Filter = "書籍名 Like 'BookName'"

このように書いて、検索ボタンを押したらDataGridViewの中身が全て表示されなくなったので
「うまく出来ないな~」と思ったのです。
ちゃんと登録されている名前なのに・・・
なにか間違っているのでしょうか?

・どのような検索機能を作りたいか。
単純に、TextBoxに入力された文字を含むデータをDataGridViewに表示させたいだけです。
検索結果に対して何かしたいとかは、今のところありません。
あと、「名前があると嬉しい」とのことなので、次からは「れいじ」と名乗ります。
投稿者 れいじ  (中学生) 投稿日時 2009/2/7 04:54:09
できました!!
Dim BookName As String
BookName = SearchTextBox.Text
BookDataTableBindingSource.Filter = "書籍名 Like '" & BookName & "%'"

と書いたらできました。
最終的にかずきさんが最初に書いてくれた通りになりましたね。
お世話になりました。
次に質問した時もお願いします。