• 締切済み

ListViewで条件式を使う方法

Visual Basic 2010でDatasetとListviewを使ってプログラムを作成しています。 DatasetのデータをListviewに表示させるプログラムは下記のコードで完成しました。 ******************************* Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With ListView1 .Columns.Add("date", 40, HorizontalAlignment.Left) .Columns.Add("no", 40, HorizontalAlignment.Left) .Columns.Add("住所", 100, HorizontalAlignment.Left) showlist() End With End Sub Private Sub showlist() Try 住所TableAdapter.Fill(Kz526DataSet.住所) Catch ex As Exception MessageBox.Show(ex.Message, "住所テーブル") End Try With Kz526DataSet.住所 For i As Integer = 0 To .Rows.Count - 1 ListView1.Items.Add(.Rows(i)("date"), (i)) ListView1.Items(i).SubItems.Add(.Rows(i)("no")) ListView1.Items(i).SubItems.Add(.Rows(i)("住所")) Next End With End Sub ************************************ 次に、Datasetのデータの内一部だけListviewに表示させることにしました。そのため、テキストボックスを設けて、その日付と同じデータをListviewに表示させます。 テキストボックスを設けて、ボタンをクリックしてデータをListviewに表示させようとしたコードです。 Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load With ListView1 .Columns.Add("date", 40, HorizontalAlignment.Left) .Columns.Add("no", 40, HorizontalAlignment.Left) .Columns.Add("住所", 100, HorizontalAlignment.Left) showlist() End With End Sub Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click 住所TableAdapter.Fill(Kz526DataSet.住所) With Kz526DataSet.住所 For c As Integer = 0 To .Rows.Count - 1 If TextBox1.Text = Kz526DataSet.住所.Rows(c)("data") Then ListView1.Items.Add(.Rows(c)("date"), (c)) ListView1.Items(c).SubItems.Add(.Rows(c)("no")) ListView1.Items(c).SubItems.Add(.Rows(c)("住所")) End If Next End With End Sub *************************************** このコードでは、条件式とListViewの関係がいまくいきません。エラーメッセージは次の様に表示されます。 「'3' の InvalidArgument=Value は 'index' に対して有効ではありません。 パラメーター名: index」 いろいろ試行錯誤してみましたところ、「ListView1.Items(c).SubItems.Add(.Rows(c)("no"))」のところで止まります。 if文では、Thenのあとは1行しか書けないのでしょうか。書き方をご指導ください。

みんなの回答

  • MARU4812
  • ベストアンサー率43% (196/452)
回答No.1

単純なバグです。 Form1_Load 時はデータの数だけ c をカウントアップすればいいですが、 条件を指定して絞り込むと、元データよりリストのデータが少なくなる のだから、データ数だけカウントアップしてしまう c は使えないです。 c 番目のリストアイテムが用意されていないという意味でエラーに なっています。 エラーの近辺で全ての変数の値を確認していくという初歩的なデバッグ 作業で見付かるバグなので、それが見つけられないというのは、デバッグ のやり方を勉強していないという事になります。 余談。 >If TextBox1.Text = Kz526DataSet.住所.Rows(c)("data") Then "data" はスペルミスでしょうか?データ?デート? あと、この比較だと文字列に変換しての比較になると思います。 "2012/06/01""2012/6/1""2012/06/01 00:00"人間には同じ日付に 解釈できてもコンピュータにとっては違うデータです。 日付型で比較すべきでは? 色々とつっこみどころが多すぎて、勉強して下さいとしか言えない ですが。。。もともとプログラムって掲示板で質問するくらいでは 習得できないものですけどね。。。基本的なところが足りてないです。