1

このリストからアイテムを追加/編集/削除するためのListViewとボタンを備えたフォームがあります。保存&キャンセルボタンがあります。キャンセルボタンを押すと、現在のフォームで行われたすべての変更を元に戻したいです。したがって、フォームをロードしている間、私は以下のように元のリストのコピーを保持します。

backupMyListView = MyListView

キャンセルボタンコードでは、反対のことをします。

MyListView = refMyListView

何が起こっているのかというと、MyListViewが更新されるたびに、backupMyListViewも更新されていたため、元のリストビューが復元されることはありません。

キャンセルボタンを押して元のListViewを復元するにはどうすればよいですか?

4

3 に答える 3

2

両方のリストは明らかに同じリストを参照しています。

基本的に、オブジェクトのクローンを作成またはコピーする必要があります。

Dim backupMyListView As New ListView
For Each lv As ListViewItem In MyListView.Items
  backupMyListView.Items.Add(lv.Clone)
Next
于 2012-05-12T13:27:38.150 に答える
1

値型と参照型の違いを調べる必要があります。変数を別の変数の値に設定すると、値がオブジェクトの値型(TypeDef構造)である場合にのみデータがコピーされます。値がオブジェクトの参照型(クラス)の場合、同じオブジェクトへの別の参照を作成するだけです。したがって、新しいListViewオブジェクト(参照型)を作成し、それに2つの異なる変数を設定すると、両方とも同じオブジェクトを指します。1つの変数を介して行われた変更は、他の変数にも影響します。データのコピーを作成するには、Cloneメソッドを使用する必要があります。

于 2012-05-12T13:45:25.600 に答える
1

このような :

Private List<ListViewItem> ListViewStore As New List<ListViewItem>;
Sub Backup()
    For Each ListViewItem LItem in MyListView.Items
        ListViewStore.Add(LItem.Clone)
    Next
End Sub
于 2012-05-13T03:03:14.053 に答える