VB2010 ListViewの使い方とトラブルシューティング

このQ&Aのポイント
  • VB2010でListViewを使っていますが、一部のデータを移す際に問題が発生しています。
  • Form2のListViewをForm4に表示する際には問題なく動作していますが、Form3のListViewをForm5に表示するとエラーが生じます。
  • 移すデータに関するコーディングも正しく行っているはずですが、解決策が見つかりません。どこに問題があるのか教えていただけると幸いです。
回答を見る
  • ベストアンサー

VB2010 ListView 使い方

VB2010でListViewを使っています。かなり順調にプログラムが出来ているのですが、トラブルに遭遇しました。 Form1でDATAを入力して、Form2とForm3でそのDATAをListViewを使って表示しています。 そして、Form2のListViewをForm4に簡素化した雛形にして、ListViewを使って表示させています。 同様に、Form3のListViewをForm5に簡素化した雛形にして、ListViewを使って表示させています。 Form2からForm4は問題なく表示されますが、Form3からForm5はエラーとなります。 エラーは次のところで生じます。 ListView1.Items(2).SubItems.Add(Form3.ListView1.Items(1).SubItems(2)) エラーメッセージは次のようです。 「'1' の InvalidArgument=Value は 'index' に対して有効ではありません。」 また、次のようにコーディングしてみると、 ListView1.Items(2).SubItems.Add(Form3.Label2.Text) 「Labl2」と表示されるだけです。Label2の情報は表示されません。 単純にDATAを移すだけなのに、1つは出来て、もう1つは出来ないというのが分かりません。 どこに問題があるのでしょうか。 かなり悩んでいますが、解決策が見出せません。 ご教授いただける方が居られましたら、宜しくお願い申し上げます。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

既定のインスタンスを使ってしまっています。 ちゃんとNewしたインスタンスをそのまま使うようにしてください。 さらにいうなら,他のFormのコントロールを触るのは筋が悪いです。 Formが入出力を受け持つメソッドやプロパティを持つのがよいです。 この時コントロールを引数や戻り値に使ってはいけません。 徹底すると,ModelとViewの分離,という話になりますが……。

totti1800
質問者

補足

アドバイスをありがとうございました。 NEWを使ってDim F_form3 As New Form3とコードしましたが、結果は同じでした。 別の視点から、Form2のDATAをForm5に移すことを試みてみました。 すると上手くDATAはForm5に移っています。ちなみに、Form2はNEWを使っていません。 ということは、Form3はForm5に受け入れられない何かがあるということでしょう。 既定のインスタンスでも上手く動いている箇所のほうが多いので、今回の場合はそれが原因ではなさそうです。

関連するQ&A

  • VB2010 LISTVIEW 計算

    VB2010でLISTVIEWを使っています。 LISTVIEWの数字とLISTVIEW外のLABEL4の数字と合計してsuzuに格納したいのです。 Dim suzu As Long suzu = clng(Me.ListView1.Items(2).SubItems(3).Text) - clng(Me.ListView1.Items(3).SubItems(3).Text) + CLng(Me.Label4.Text) Me.ListView1.Items(4).SubItems(3).Text = CStr(Format(suzu, "#,0")) 実行させるとエラーとなります。エラーメッセージは次のようです。 「String "Label4" から型 'Long' への変換は無効です。」 トラブルシューティングのヒントを見ても対応方法が分かりません。 ご存知の方は、ご指導をお願いします。

  • 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行しか書けないのでしょうか。書き方をご指導ください。

  • ListViewにて行追加

    Visual C# 2005初心者です。 ListViewを使用して、データを表示するのに、 listView1.Items.Add("1111111", 3); listView1.Items.Add("2222222", 3); listView1.Items.Add("3333333", 3); と書くと、列が追加されます。 行を追加するには、どうすればよいのでしょうか? どうか、教えてください。

  • VB.NETでフォーム間でのコントロールの参照

    VB.NETでフォーム間でのコントロールの参照が うまくいかず困っています Windows フォーム Form1とForm2があります Form1にはリストビュー(name:ListView1)を配置しています Form1_LoadイベントでListView1にアイテムを追加します Form2を表示し、Form1のListView1のアイテム数を、 取得しようとすると 0 になってしまします どうすればForm2から取得できるのでしょうか? 次のように書いています Form1_Load イベント内 ListView1.Items.Add("Item1") ListView1.Items.Add("Item2") ListView1.Items.Add("Item3") MessageBox.Show(CStr(ListView1.Items.Count), "Form1") Dim Form2 As New Form2() Form2.Show() Form2_Load イベント内 Dim Form1 As New Form1() MessageBox.Show(CStr(Form1.ListView1.Items.Count), "Form2")

  • VB6.0初心者です。基本的なことですいません

    VB6.0初心者です。基本的なことですいません ListViewコントロールでListItemの追加がよくわかりません。  (1)Listview1.ListItems.Add.Text = objDrive.DriveLetter Listview1.ListItems.Add.SubItems(1) = objDrive.VolumeName と記述すると、1段ずれて表示されてしまいます。  (2)With Listview1.ListItems.Add()   .Text=objDrive.Driveletter  .SubItems(1)=objDrive.VolumeName   End With 又は、  (3)Dim lstItem as ListItem Set lstItem = ListView1.ListItems.Add() lstItem.text=objDrive.DriveLetter lstItem.SubItems(1)=objDrive.VolumeName の記述でうまくいくのですが、 なぜ、(1)だと1段ずれるのか、この理由がわかりません。よろしくお願いします。

  • VB6 LISTVIEWで項目の色分けをしたいのですが

    VB6のLISTVIEWで 条件によって明細レコードを表示するときに文字を変えたいのですが どのような方法がありますでしょうか ※flexGridをすればできるのでしょうが、プログラムを大々的に組み直しをしたくないので現在のFORM(LISTVIEW)で色分けを考えております どなたかご教示をお願います。

  • VB2008でリストを横に表示させたい

    ListViewで下記のように横表示させたいです。  年  | 月 |  学歴   | 平成04  3   小学校卒業 平成07  3   中学校卒業 下記のソースでためしたのですが、改行されてすべて縦に表示されてしまいます。 ListView1.Items.Add("平成04") ListView1.Items.Add("3") ListView1.Items.Add("小学校卒業" & vbCrLf) ListView1.Items.Add("平成07") ListView1.Items.Add("3") ListView1.Items.Add("中学校卒業" & vbCrLf) お手数ですが何かアドバイスお願いします。

  • vb2008です。ListViewついてです。

    初心者です。説明に分かりにくい所もあるかと思いますがよろしくお願いします。 csvファイルを用いてListViewで一覧の作成をしています。 Using textPatser As New Microsoft.VisualBasic.FileIo.TextPatser("C:¥~¥.csv",System.Text.Encoding.GetEncoding("UTF-8")) textPatser.TextFiledType=FileIo.FiledType.Delimited textPatser.HasfildsEnclosedInQuotes=True textPatser.SetDelimitedrs(",") ListView1.Items.Clear() While Not textPatser.EndOfData Dim fields As String() = textPatser.ReadFields() ListView1.Items.Add(New ListViewItem(fields)) End while End Using のコードにてListViewの一覧に入力しました。 一覧に国名の列があり0001,0002,0003....と入力しています。 別のcsvファイルに数字のコードと国名 国コード,国名 0001,日本 0002,アメリカ 0003,フランス と作りました。これを認識、0001の所は、日本と表示出来るようにしたいのですが 仕方を知りたいです。よろしくお願いします。

  • シートからのListViewへのやり方

    はじめまして、宜しくお願い致します。 シートからのListViewへの読み込みで 早くListViewへ表示させたいのですが よろしければご教授できればと質問させて 頂きました。 下記のコードは現在利用しているコードです。 Private Sub UserForm_Initialize() With ListView1 .View = lvwReport .FullRowSelect = True .AllowColumnReorder = True .Gridlines = True .AllowColumnReorder = True '列幅の変更を許可 .CheckBoxes = True 'チェックボックスの追加 '.ForeColor = vbBlue .ColumnHeaders.Add , , "NO", 70 .ColumnHeaders.Add , "B", "名前", 100 .ColumnHeaders.Add , "C", "性別", 50 .ColumnHeaders.Add , "D", "血液型", 50 .ColumnHeaders.Add , "F", "生年月日", 100 For i = 4 To Cells(Rows.Count, "B").End(xlUp).Row Application.ScreenUpdating = False With .ListItems.Add .Text = Format(Cells(i, "B"), "0") '.Text = Right(Space(3) & .Text, 3) .SubItems(1) = Cells(i, "C") .SubItems(2) = Cells(i, "D") .SubItems(3) = Cells(i, "E") .SubItems(4) = Cells(i, "F") End With Next End With Application.ScreenUpdating = True

  • ListViewコントロールでサムネイル画像を一覧表示するには?

    VB初心者です。 .NET TIPSの中に「ListViewコントロールでサムネイル画像を一覧表示するには?」というものがありました 今回、それを利用してサムネイル一覧の表示をしようとして行き詰りました。 作りたいのは以下のものです ○決まったサイズの画像(bitmap)を表示し、その下にファイル名(フルパスでは無い)を表示し、更にその下に元の画像のサイズを表示するようなものを作成したいのですが、作成可能でしょうか? また、作成可能な場合、どういった方法で作成したら良いか教えて下さい。 行き詰ったのは、第一段階の、サムネイル画像のしたのファイル名の所です。 よく分からずに ListView1.Items.Add(bmpFiles(i), i)の所を Dim bmpFileName As String = _ Path.GetFileNameWithoutExtension(bmpFiles(i)) ListView1.Items.Add(bmpFileName) bmpFileName(ファイル名のみ)に変更したら、ファイル名は表示されるのですが、画像が表示されませんでした。 次に両方書いたのですが画像の下にフルパスその横にファイル名が表示されます。 Dim bmpFileName As String = _ Path.GetFileNameWithoutExtension(bmpFiles(i)) ListView1.Items.Add(bmpFiles(i), i) ListView1.Items.Add(bmpFileName) 色々調べてみたのですが、思ったような記述が無かったのでここで質問させて頂きました。 拙い質問なので分かり難いかと思いますがアドバイスをよろしくお願いいたします。

専門家に質問してみよう