0

目標:いくつかの TextBox を埋める

問題:最初TextBoxの値が満たされると、次の値が損なわれます。それは3つのステップで起こります。

最初の一歩。2 つの TextBox を埋める必要があるとします。パブリック関数はこれを行います:

Public Sub FillingTextBoxes(Name As String) 
    'Fetching my object from a collection
    Dim newObject As MyClass = MyCollection.Item(Name)

    'Filling two textboxes
    With newObject 
        TextBox1.Text = .Property1.ToString
        TextBox2.Text = .Property2.ToString

MyCollection は publicMicrosoft.VisualBasic.Collectionです。

第二段階。充填するとイベントTextBox1がトリガーされます。TextChanged別のパブリック関数は、同じオブジェクトの値を変更します:

Public Sub SomeOtherFunction(Name As String) 
    Dim newObject As MyClass = MyCollection.Item(Name)
    newObject.Property2 = "something else"

第三段階、ここまで来ました。SomeOtherFunctionの実行が終了して に戻ると、別の関数で発生したにもかかわらず、FillingTextBoxesの値newObject.Property2は nowになります。"something else"

どうすればこれを解決できますか?

4

1 に答える 1

2

コレクションに格納しているものがカスタムクラスである場合は、ディープコピーcloneを許可する関数を実装する必要があります。

クローン機能を使用すると、オブジェクト参照を取得して、別のオブジェクトへの新しい参照である同じタイプの新しいコピーを返すことができます。たとえば、これがある場合:

public class MyClass

    public Property1 as string
    public Property2 as string

    public sub new()
        Property1 = string.empty
        Property2 = string.empty
    end sub

    public function clone() as MyClass
        dim returnThis as new MyClass

        returnThis.Property1 = Property1
        returnThis.Property2 = Property2        

        return returnThis
    end function

end class

次に、次のような新しいディープコピーを呼び出すことができます。

Public Sub SomeOtherFunction(Name As String) 
    Dim newObject As MyClass = MyCollection.Item(Name).clone()
    newObject.Property2 = "something else"

また、コレクション内の参照の代わりに同じオブジェクトの新しいコピーを使用しているため、問題はありません。

于 2013-02-01T14:05:16.837 に答える