0

別のスレッドから ListView オブジェクトにアクセスしようとしています。私がやっている方法は、新しいスレッドの一時的な ListView を作成し、新しいリストが作成されるたびに、この一時的な ListView を元のリストにコピーすることです。

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

私が単に行う場合:

ListView lv_temp = lv_original

次に、それを参照によってコピーすると、さらにスレッド アクセス エラーが発生します。

では、値によって完全なクローンを作成するにはどうすればよいでしょうか?

4

2 に答える 2

1

あなたがしたいことは、リストをディープコピーすることです。そのため、この拡張機能を使用できます。

/// <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);
        }
    }
}    

さて、なぜこれを行うのか、リストを別のスレッドに渡さないのはなぜですか、それですべてです(再度変更している場合)。それがUIコントロールの場合(私が見ているものに当てはまるかもしれません)、(他のスレッドからの)バックグラウンドItemsSourceを使用してから、ディスパッチャーを使用してUIのソースとして使用できます。それが必要な場合は、詳細を提供するためにお知らせください。

于 2012-04-22T17:40:00.677 に答える
1

オブジェクトを DataSource として提供する必要があります。データソースが更新されると、UI コントロールが更新されます。それ以外の場合、スレッド化の問題が発生した場合は、を使用してフィールド メンバーにSynchronizationContext.Current割り当ててから、次のようにします。sync

  // 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);

更新
回答が見つかりましたどうやってバインドしますか ... . そのため、当初想定していた DataSource プロパティはありません。

于 2012-04-22T17:46:32.893 に答える