Form1 の VB.Net アプリに 2 つのフォームがあります Listview 要素があります Form2 に同じ Listview を表示したいのですが、サイズが異なりますが、これを行う最善の方法は何ですか? ありがとう
1 に答える
いいえ、あるコントロールの内容ListView
を別のコントロールにコピーする組み込みの方法はありません。むしろ、ビジネス ロジックが UI から分離されるように、コードを再構築する必要があります。API からデータを取得するロジックと、ListView
そのデータをコントロールに入力するロジックの両方が、任意のフォームで使用できる別の共通クラスにある必要があります。これを行うには、フォーム、クラス、およびメソッド間で簡単に受け渡されるある種のデータ構造で、データをメモリに格納する必要があります。たとえば、リスト内の各項目をAtom
クラスとして表すことができる場合は、List(Of Atom)
オブジェクトを使用してデータを保持することをお勧めします。たとえば、共通クラスは次のようなものになる可能性があります。
Public Class ShoppingBusiness
Public Function GetData() As List(Of Atom)
' Get data from API and return it as a List(Of Atom) object
End Function
Public Sub LoadList(atoms As List(Of Atom), list As ListView)
' Load the ListView control with the data
End Sub
End Class
ビジネス ロジックがそのような独自のクラスに分割されると、そのコードをすべて複製することなく、任意のフォームからすべてのロジックに簡単にアクセスできます。ただし、両方のフォーム (この例では call ) を使用するのではなく、これはShoppingBusiness.GetData
おそらく低速な方法であるため、一度だけ実行してから、同じデータを使用して両方のListView
コントロールにデータを入力することをお勧めします。たとえば、 がForm1
表示Form2
されている場合、次のように実行できます。
Public Class Form1
Private _data As List(Of Atom)
Private _business As ShoppingBusiness = New ShoppingBusiness()
Private Sub refreshList()
_data = _business.GetData()
_business.LoadList(_data, ListView1)
End Sub
Private Sub showForm2()
Dim form2 As Form2 = New Form2()
form2.Data = _data
form2.Show()
End Sub
End Class
Public Class Form2
Private _data As List(Of Atom)
Private _business As ShoppingBusiness = New ShoppingBusiness()
Public Property Data() As List(Of Atom)
Get
Return _data
End Get
Set(ByVal value As List(Of Atom))
_data = value
End Set
End Property
Private Sub refreshList()
_business.LoadList(_data, ListView2)
End Sub
End Class
この例でわかるように、Form1 は取得したデータのコピーをメモリに保持します。プライベート_data
フィールドにデータを保持します。新しいForm2
オブジェクトを作成すると、それを表示する前に、メモリ内に既にあるデータへの参照が与えられます。次に、Form2
同じLoadList
メソッドを使用してデータをリストにロードできますが、データは によって渡されたため、API から再度データを取得する必要はありませんForm1
。