14

IList を GridView にバインドしています。IMyInterface は次のようになります

public interface IMyInterface: IHasTotalHours, IHasLines
{
    DateTime GoalStartDate { get; set; }
    DateTime GoalEndDate { get; set; }
}

次のようにインスタンスを Grid にバインドします。

IList<IMyInterface> instance= GetMyData();

myGrid.DataSource = instance;
myGrid.DataBind();

これをグリッドにバインドすると、グリッドに表示される唯一のメンバーは、IMyInterface の直接のメンバーである GoalStartDate と GoalEndDate です。

何故ですか?グリッドが継承する他のインターフェイスのメンバーを表示するにはどうすればよいですか?

更新 継承されたインターフェイスは、次のような単純なデータ プロパティを定義します

public interface IHasTotalHours
{
    string Description { get; set; }
    int Hours{ get; set; }
}
public interface IHasLines
{
    double TotalLines { get; set; }
    double LinesPerHour { get; set; }
}

IMyInterface を実装するクラスがあります。

public class MyClass : IMyInterface
{
    public string Description { get; set; }
    public int Hours { get; set; }
    public double TotalLines { get; set; }
    public double LinesPerHour { get; set; }
    public DateTime GoalStartDate { get; set; }
    public DateTime GoalEndDate { get; set; }

}

これらは IMyInterface としてキャストされ、GridView にバインドしているリストに返されます。

4

2 に答える 2

7

データ バインド コントロールはリフレクションを使用せず、TypeDescriptor を使用してデータ ソースからプロパティを取得します。TypeDescriptor.GetPropertiesメソッドでは、次の内容を読み取ることができます。

コンポーネントが配置されている場合、サイトはプロパティを追加または削除できるため、コンポーネントのプロパティはクラスのプロパティとは異なる場合があります。

どうやら、デフォルトの実装は、継承されたものではなく、インターフェイスからの直接のプロパティのみを返します。

幸いなことに、このメカニズムは拡張可能であり、カスタム プロパティ情報の実装を使用してTypeConverterクラスを作成できます。プロパティ ロジックの実装については、TypeConverter ドキュメントの備考を参照してください。

カスタム TypeConverter クラスの GetProperties 実装は、インターフェイスとその継承されたすべてのインターフェイスで TypeDescriptor.GetProperties(Type) を呼び出すことができます。しかし、リフレクションを使用して継承されたすべてのプロパティを見つけるジェネリック TypeConverter を作成することもできます。

次に、TypeConverterAttribute 属性を使用して、このカスタム TypeConverter をインターフェイスにアタッチします。

そして、魔法のように、データ ソースはすべてのプロパティを見つけます。;-)

于 2009-02-24T04:15:52.513 に答える
-1

これは、インターフェイスがコントラクトであるためです。オブジェクトと対話する唯一の方法は、その特定のコントラクトを使用することです。他のインターフェイスは想定できず、キャストが行われるまで利用できません。

したがって、 T のリストを何かにバインドすると、データグリッドはそれらの他のインターフェイスについて認識しません。また、データグリッドは、リフレクションを使用して、他のどのクラスまたはインターフェイスが継承される可能性があるかを把握しません。データグリッドで使用できる唯一のオブジェクト プロパティは、T インターフェイスによって公開されるプロパティです。

データグリッドがすべてのプロパティにアクセスできるようにする場合は、List をバインドする必要があります。

于 2009-02-12T04:45:28.730 に答える