2

私はオブジェクトのリストを持っていますList<Bar> barlist. これらのBarorobjects はかなり複雑であり、私はそれらを深くコピーせずに進んでいきたいと思っています。

BindingSourceただし、ユーザーが、BindingNavigatorおよびを使用してそれらを変更できるようにしたいと思いますDataGridView。ただし、をバーリストに設定しDataSourceて値をBindingSource変更すると、リストが変更されます (明らかに独自のリストを保持していないか、浅いコピーのみを使用しているため)。

問題は、ユーザーが自分の変更を破棄したい場合はどうするかということです。BindingSourceディープ コピーされたリストを指定する場合は、それらを手動で元に戻すか、元のリストに適用しないでください。ただし、ディープコピーは避けたいと思います。

代替パスはありますか?それとも、オブジェクトにマークを付けてSerializableディープコピーする以外に選択肢はありませんか?

4

2 に答える 2

2

記録として、次のディープ クローン機能を使用して問題を解決しました。これは最善の解決策ではないかもしれませんが、十分であり、問​​題なく動作します (ただし、Serializable オブジェクトの場合のみ)。

// Creates a deep copy of an Object
public static T DeepClone<T>(T obj)
{
    using (var ms = new MemoryStream())
    {
        var formatter = new BinaryFormatter();
        formatter.Serialize(ms, obj);
        ms.Position = 0;

        return (T)formatter.Deserialize(ms);
    }
}
于 2013-02-27T14:19:15.637 に答える
1

Memento Patternを使用することをお勧めします。

基本的に、各バーの状態をユーザーが編集を開始する前の状態に復元できる個別のオブジェクトを作成する必要があります。これは通常、ディープ コピーよりも簡単で安価です。

于 2013-02-02T15:02:50.093 に答える