0

そのフィールドに表示される画像を設定するために使用される ImageGetterDelegate を使用して、ObjectListView で動的に生成された列を作成するときに問題が発生します。

次のことをしようとすると:

myOLVColumn.ImageGetter = delegate(Object x) { /*can't access myOLVColumn here*/ return getImage(x); };

デリゲート内の元の Column オブジェクトにアクセスできません (表示する画像を決定する必要があります)。

解決策は、デリゲートの代わりにまだ見つけられなかったイベントを使用している可能性があります。

デリゲート内の列オブジェクトにアクセスできるかどうか、または他の動的な方法で列のプロパティに基づいてフィールド イメージを設定できるかどうかは誰にもわかりませんか?

もしそうなら、どのように?

それが不可能な場合は、次のように変更するとよいでしょう。

 public delegate object ImageGetterDelegate(object rowObject);

public delegate object ImageGetterDelegate(object rowObject, object sender);
4

1 に答える 1

1

私は自分で解決策を見つけました!

デリゲート定義の前にオブジェクトを作成し、そのオブジェクトをデリゲート内で問題なく使用できます。これは、デリゲート定義にポインターとして保存されます。

foreach (DirectoryInfo dir in directoryList.GetDirectories())
{
    BrightIdeasSoftware.OLVColumn myOLVColumn = new BrightIdeasSoftware.OLVColumn();
    myOLVColumn.ImageGetter = delegate(Object x) {
        /*I CAN access myOLVColumn here, 
as far as I don't mess with that object in the other code, 
and even if the for loop changes myOLVColumn, as far as it makes a new one and don't destroy it
the delegate will still have the pointer to the object the variable pointed to 
during the generation of the delegate*/
        return getImage(x, myOLVColumn);
    };
    //...
}

myOLVColumn オブジェクトはデリゲート オブジェクトによってポイントされているため、ガベージ コレクターはそのオブジェクトを削除しません。

このトリックはプリミティブ型ではうまく機能しません。その var への変更はすべてのデリゲートに影響するためです。デリゲートはオブジェクトへのポインターではないためです。の上)。

とにかく、ちょっとトリッキーなので、ObjectListView ライブラリの内部の仕組みをあまり台無しにしないという前提で、デリゲートの定義を拡張するとよいでしょう。

于 2013-11-20T08:27:43.783 に答える