2012-04-22 35 views
0

別のスレッドからListViewオブジェクトにアクセスしようとしています。私がそれをやっているやり方は、新しいスレッドのための一時ListViewを作成してから、この新しいリストが移入されるたびにこの一時ListViewを元に戻すことです。リストビューをListViewにコピーする - C#.NET 2.0

私はListViewオブジェクトをコピーするのが難しいです。私は周りを見回してアイテムをコピーする方法を見つけましたが、私も同じように列と構造が必要です。

私は単純に行う場合は、次の参照によって

ListView lv_temp = lv_original

、それをコピーして、と私はより多くのスレッドアクセスエラーを取得します。

どのようにして完全な値でクローンを作成できますか?今

/// <summary> 
/// Reference Article http://www.codeproject.com/KB/tips/SerializedObjectCloner.aspx 
/// 
/// Provides a method for performing a deep copy of an object. 
/// Binary Serialization is used to perform the copy. 
/// </summary> 

public static class ObjectCopier 
{ 
    /// <summary> 
    /// Perform a deep Copy of the object. 
    /// </summary> 
    /// <typeparam name="T">The type of object being copied.</typeparam> 
    /// <param name="source">The object instance to copy.</param> 
    /// <returns>The copied object.</returns> 
    public static T Clone<T>(T source) 
    { 
     if (!typeof(T).IsSerializable) 
     { 
      throw new ArgumentException("The type must be serializable.", "source"); 
     } 

     // Don't serialize a null object, simply return the default for that object 
     if (Object.ReferenceEquals(source, null)) 
     { 
      return default(T); 
     } 

     IFormatter formatter = new BinaryFormatter(); 
     Stream stream = new MemoryStream(); 
     using (stream) 
     { 
      formatter.Serialize(stream, source); 
      stream.Seek(0, SeekOrigin.Begin); 
      return (T)formatter.Deserialize(stream); 
     } 
    } 
}  

あなたがリストにを渡さない、なぜ私は、あなたがこれをやっている理由を尋ねることがあり、:あなたはこの拡張機能を使用することができますので、あなたが何をしたいのか

+3

ただしないでください。スレッド内のデータのみを作成します。それを、例えばList <>といっしょに入れる。 ListViewはUIスレッドでのみ作成します。 BackgroundWorkerで簡単にできます。 –

+0

はい、ハンスは何を言ったのですか?適切なデータソースを使用する必要があります。 – IAbstract

+0

それは私がやったことのようなものです。構造体がすでに存在しているので、ListView全体をコピーしたいだけでした。私はちょうど同じ列を持つ新しい構造を作成し、行ごとに実際の構造にコピーしました。 – CJxD

答えて

1

は、深いコピーにリストされ別のスレッドとthatsすべて(あなたが再びそれを変更していることを考えると)。 UIコントロール(私が見ているかもしれません)の場合は、バックグラウンドのItemsSource(別のスレッドから)を使用して、Dispatcherを使用してUIのソースとして使用できます。それがあなたが望むものなら、私に詳細を提供することを知らせてください。

+0

良い解決策 - しかし、ここでは最初にソースメソッドを試してみます。この方法では、私の参考文献にさらに別のソースを追加する必要があります。 – CJxD

+0

確かに、それは私の2番目の段落で私が言及する解決策です(しかし、説明しません)。幸運:) –

+0

私は間違っている可能性がありますが、これは、OPが実際に達成しようとしているものから離れていると思います - IMO、質問は* "どのようにデータがクロスリファレンスなしで更新されたとき、スレッドの例外 "* – IAbstract

1

オブジェクトをデータソースとして指定する必要があります。データソースが更新されると、UIコントロールが更新されます。あなたがスレッドの問題に実行する場合、そうでない場合は、その後、syncフィールドメンバにSynchronizationContext.Currentを使用して割り当てます

// since I believe you don't have lambdas in .net 2.0 I'll try to write this out proper 
    // although it is untested, but I hope you get the idea 
    sync.Send(new SendOrPostCallback(SendCallBack), stateObject); 

    void SendCallBack(object state) { 
    // perform UI tasks here 
    } 

SynchronizationContextは新しいです.NET 2.0

...再び、これはテストされていないが、私がしなければならないのなら、私が始めるところです。 (?)はさておき、提示する.NET 3.0で、我々は書くのと同じように:

sync.Send((state) => { 
    // perform UI tasks here 
    }, stateObject); 

更新
答えHow do you bind ...を発見しました。元々私が推測していたように、DataSourceプロパティはありません。

+0

それはきれいに見えます。私はそれが動作するかどうかを確認します。それは私のクイックソート機能でソート可能でなければなりません - それがIComparableである限り、私は大丈夫です。さもなければ、私はListViewオブジェクトのために持っているように比較器を作る必要があります。 – CJxD

+0

リストビュー用のデータソースを作成する必要があります。次に、あなたが望む動作を実装することができます。 – IAbstract

+0

この回答も他の回答も役に立ちませんでした。これは、データソースをListViewに強制しようとする努力の価値がないので、私はあきらめて列の列をコピーし、行の行をコピーします。 – CJxD

関連する問題