ListViewの項目をForm以外のクラスから取得するには?

解決


shellken  2006-06-04 02:56:39  No: 95640

以下のコードはあるサンプルから作ったものです。
3つのコードとForm1にListview1を貼り付けています。

これをVB.net2005 Expres Editionで以下のコードの中に書いたのでみてほしいのですが、
「ここでエラーが出る①」のところでエラーが出ます。
「ここはエラーが出ない②」のところはForm1の中でのコードですがエラーとなりません。

いまあるプログラムを作っていてForm1の中でのコードが多くなりすぎるとVBがの処理が重いので、
class1としてこのコードを分けようと思い以下のようにしましたが、
「ここでエラーが出る①」のところでどうしてもエラーが出ます。
どうしたらエラーが出ないのでしょうか?

要するにForm1 に貼り付けたListview1の中の項目を、Form1の中に書いたコードからではなく、
class1のコードから取得したいのですが。。。

'Form1.Designer.vbのコード********************************

<Global.Microsoft.VisualBasic.CompilerServices.DesignerGenerated()> _
Partial Class Form1
    Inherits System.Windows.Forms.Form

#Region " Windows フォーム デザイナで生成されたコード "

    Public Sub New()
        MyBase.New()

        ' この呼び出しは Windows フォーム デザイナで必要です。
        InitializeComponent()

        ' InitializeComponent() 呼び出しの後に初期化を追加します。
        InitializeListView()

    End Sub

    ' Form は、コンポーネント一覧に後処理を実行するために dispose をオーバーライドします。
    Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean)
        If disposing Then
            If Not (components Is Nothing) Then
                components.Dispose()
            End If
        End If
        MyBase.Dispose(disposing)
    End Sub

    ' Windows フォーム デザイナで必要です。
    Private components As System.ComponentModel.IContainer

    ' メモ : 以下のプロシージャは、Windows フォーム デザイナで必要です。
    'Windows フォーム デザイナを使って変更してください。  
    ' コード エディタを使って変更しないでください。
    Friend WithEvents ListView1 As System.Windows.Forms.ListView
    <System.Diagnostics.DebuggerStepThrough()> Private Sub InitializeComponent()
        Me.ListView1 = New System.Windows.Forms.ListView
        Me.SuspendLayout()
        '
        'ListView1
        '
        Me.ListView1.Location = New System.Drawing.Point(16, 16)
        Me.ListView1.Name = "ListView1"
        Me.ListView1.Size = New System.Drawing.Size(264, 232)
        Me.ListView1.TabIndex = 0
        '
        'Form1
        '
        Me.AutoScaleBaseSize = New System.Drawing.Size(5, 12)
        Me.ClientSize = New System.Drawing.Size(292, 266)
        Me.Controls.Add(Me.ListView1)
        Me.Name = "Form1"
        Me.Text = "Form1"
        Me.ResumeLayout(False)

    End Sub

#End Region
End Class

'Class1.vbのコード******************************** 
Public Class Class1
    Public Sub aaa()
        Dim fm As New Form1
        Dim b = fm.ListView1.Items(1).SubItems(1).Text'<------ここでエラーが出る①
    End Sub
End Class

'Form1.vbのコード****************************************
Imports Microsoft.Win32

Public Class Form1
    Inherits System.Windows.Forms.Form

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load

        RefreshListView()

    End Sub

    Private columnName As ColumnHeader
    Private columnType As ColumnHeader
    Private columnData As ColumnHeader

    ' ListViewコントロールを初期化します。
    Private Sub InitializeListView()
        ' ListViewコントロールのプロパティを設定
        ListView1.FullRowSelect = True
        ListView1.GridLines = True
        ListView1.Sorting = SortOrder.Ascending
        ListView1.View = View.Details

        ' 列(コラム)ヘッダの作成
        columnName = New ColumnHeader
        columnType = New ColumnHeader
        columnData = New ColumnHeader
        columnName.Text = "名前"
        columnName.Width = 100
        columnType.Text = "種類"
        columnType.Width = 60
        columnData.Text = "データ"
        columnData.Width = 150
        Dim colHeaderRegValue() As ColumnHeader = _
          {Me.columnName, Me.columnType, Me.columnData}
        ListView1.Columns.AddRange(colHeaderRegValue)
    End Sub

    ' ListViewコントロールのデータを更新します。
    Private Sub RefreshListView()
        ' ListViewコントロールのデータをすべて消去します。
        Me.ListView1.Items.Clear()

        ' ListViewコントロールにデータを追加します。
        Dim item1() As String = New String() {"リンゴ", "果物", "赤"}
        ListView1.Items.Add(New ListViewItem(item1))
        Dim item2() As String = New String() {"メロン", "果物", "緑"}
        ListView1.Items.Add(New ListViewItem(item2))
        Dim item3() As String = New String() {"ピーマン", "野菜", "緑"}
        ListView1.Items.Add(New ListViewItem(item3))

        Dim a = ListView1.Items(1).SubItems(1).Text'<------ここはエラーが出ない②
        Dim cl As New Class1
        cl.aaa()'<------ここはでclass1を読みに行っている③
    End Sub

End Class


VB梅  2006-06-04 20:34:55  No: 95641

shellken さんへ

   cl.aaa(ListView1) '<------ここはでclass1を読みに行っている③

   Public Sub aaa(ByVal list As ListView)
        Dim fm As New Form1
        Dim b = list.Items(1).SubItems(1).Text '<------ここでエラーが出る①
    End Sub

とするもよし
        Dim b = Form1.ListView1.Items(1).SubItems(1).Text '<------ここでエラーが出る①

とするもよし

いろいろやり方はあります。
ガンバです。


shellken  2006-06-05 05:06:13  No: 95642

ありがとうございました。
解決しました。
申し訳ありませんが、追加の質問です。

①Form1から独立した別のクラスから値を取得するときは、VB梅さんがご教授してくださった 
(ByVal 任意の名前 as  コントロール名)でどのようなコントロールの場合でも使えますか?

②Public Sub aaa(ByVal list1 As ListView,ByVal list2 As ListView)
と2つ以上のListviewを渡したり、
Public Sub aaa(ByVal list As ListView,ByVal tb As Textbox)
のように違うコントロールを渡したり出来るということでしょうか?

③Form1に貼り付けたTextbox1のTextをほかのクラスから取得する場合、この  (ByVal... )がなくても取得できるのですが、今回のようにListviewではこの  (ByVal... )がなければ値を取得できないのはなぜですか?


VB梅  2006-06-05 08:30:57  No: 95643

そのくらいのことは、調べるなど、実行環境があるのですから
確認してください!

自分の力で解決しましょうね。
また、MSDNを参照してください。


shellken  2006-06-05 09:07:31  No: 95644

ありがとうございます。
いろいろやってみます。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加