VB2010+Windows7で開発しています。
検索画面にボタンとコンボボックスとテキストボックスとデータグリッドビューがあり、コンボボックスで選択した列名からテキストボックスに入力した文字列が含まれているエクセルの行をデータグリッドビューに表示する為に以下のプログラムを作成しました。
コンボボックスで「すべて」を選択した時は全列対象としたいのですが、このプログラムでは「 dv.RowFilter = "種類別 LIKE '%" & Key.Text & "%'"」が常に有効になってしまいます。
どうすれば良いのでしょうか?
Dim conStr As New OleDb.OleDbConnectionStringBuilder()
conStr.Provider = "Microsoft.JET.OLEDB.4.0"
conStr.DataSource = Application.StartupPath & "\test2.xls"
conStr("Extended Properties") = "Excel 8.0;HDR=yes;IMEX=1"
Dim sql As String = "SELECT * FROM [Sheet1$]"
Using da As New OleDb.OleDbDataAdapter(sql, conStr.ConnectionString)
da.Fill(ds, "Sheet1")End Using
table = ds.Tables("Sheet1")Dim dv As DataView = New DataView(table)
Select Case Item.SelectedItem
Case "製品名1"
dv.RowFilter = "品名1 LIKE '%" & Key.Text & "%'"
Case "製品名2"
dv.RowFilter = "品名2 LIKE '%" & Key.Text & "%'"
Case "種類別"
dv.RowFilter = "種類別 LIKE '%" & Key.Text & "%'"
Case Else
dv.RowFilter = "品名1 LIKE '%" & Key.Text & "%'"
dv.RowFilter = "品名2 LIKE '%" & Key.Text & "%'"
dv.RowFilter = "種類別 LIKE '%" & Key.Text & "%'"
End Select
DataGridView1.DataSource = dv
> dv.RowFilter = "品名1 LIKE '%" & Key.Text & "%'"
> dv.RowFilter = "品名2 LIKE '%" & Key.Text & "%'"
> dv.RowFilter = "種類別 LIKE '%" & Key.Text & "%'"
ここですがこれでは品名1,品名2の条件は反映されません。
AndとかOrとかで条件を連結する必要があります。(この場合多分Or)
dv.RowFilter = "品名1 LIKE '%" & Key.Text & "%' Or" & _
"品名2 LIKE '%" & Key.Text & "%' Or" & _
"種類別 LIKE '%" & Key.Text & "%'"
こんな感じだと思う。
すべてというのはすべての列のうちどこかに指定した内容が含まれている
ということでよいのですよね?
???
全てなんだから、Filterは不必要のはずですが。
以上。
追伸
データベースとして使っているのがExcelだから、行数に上限がある為
問題となることは低いが、取得件数が毎回全件取得した後にFilterで
制限しているのは、パフォーマンス的に勿体ないのでは?
SQL文の方でwhereで条件部分を付加してやった方が、取得件数が先に
絞れるので時間短縮になろうかと。
以上。参考まで
自分で書いた後に気が付いた(勇み足)
Excelから取得しているので、インデックスが無いから結局全件なめないと
該当データが絞れないので、whereで条件設定してもFilterでしても、さほ
どの差も出ないかと・・・
まぁ〜そういう方法もある。と言うことで。
以上。
解決しましたー。
ありがとうございました(__)
ツイート | ![]() |