C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[2]: 継承元のインターフェースのメンバーを一覧に表示したい


(過去ログ 88 を表示中)

[トピック内 3 記事 (1 - 3 表示)]  << 0 >>

■52472 / inTopicNo.1)  継承元のインターフェースのメンバーを一覧に表示したい
  
□投稿者/ 綾子 (5回)-(2010/08/10(Tue) 14:29:51)

分類:[.NET 全般] 

interface IInterfaceA
{
  int Col1 {get; set;}
}

interface IInterfaceB : IInterfaceA
{
  int Col2 {get; set;}
}

という2段階のインターフェースとそれぞれの実装があります。
IInterfaceBのリストとして
  IList<IInterfaceB> DataList
というのを作り、それをDataSourceに指定したDataGridViewを作りました。

このとき、DataGridViewにCol1と2を両方表示させたくてDataPropertyNameにCol1とCol2を指定した列を作った
のですが、Col1のほうが表示されません。

DataList[0] としてみるとCol2しかとれませんが、(IInterfaceA)DataList[0]ならCol1が取れるので、これを
何とかしてDataPropertyNameに指定できればいい。。。ところまでは分かったのですが。。。
どうやって書けばいいのでしょうか?

宜しくお願いします。

引用返信 編集キー/
■52473 / inTopicNo.2)  Re[1]: 継承元のインターフェースのメンバーを一覧に表示したい
□投稿者/ Hongliang (686回)-(2010/08/10(Tue) 15:58:48)
http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/2998956c-8bcc-4ebb-b926-7b1c1ba24d8f/
このスレッドで同様の問題が取り上げられています。
簡単に解説すると、インターフェイスの継承は「メンバを継承」するのではなく「メンバの実装要求を継承」するだけであるから、らしいですが、煙に巻かれた感じの説明ですね。

一番簡単なのは、IInterfaceB に
new int Col1 {get; set;}
を追加することでしょう。

インターフェイスに手を加えるのが難しいのなら、

・TypeDescriptionProvider 派生クラス、CustomTypeDescriptor 派生クラス、PropertyDescriptor 派生クラスを作成
・TypeDescriptionProvider 派生クラスの GetTypeDescriptor メソッドをオーバーライドして CustomTypeDescriptor 派生のオブジェクトを返す
・CustomTypeDescriptor 派生クラスの GetProperties メソッドをオーバーライドして IInterfaceA/IInterfaceB 両方のプロパティを含んだ PropertyDescriptorCollection を返す
・DataGridView に List<IInterfaceB> をバインドする前に、TypeDescriptor.AddProvider(TypeDescriptionProvider, Type) で TypeDescriptionProvider 派生クラスのオブジェクトを IInterfaceB の型記述プロバイダに設定する

という割と面倒な作業が必要じゃないかなぁ……。
引用返信 編集キー/
■52485 / inTopicNo.3)  Re[2]: 継承元のインターフェースのメンバーを一覧に表示したい
□投稿者/ 綾子 (6回)-(2010/08/11(Wed) 11:23:10)
Hongliangさん、ありがとうございます。

No52473 (Hongliang さん) に返信
> http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/2998956c-8bcc-4ebb-b926-7b1c1ba24d8f/
> このスレッドで同様の問題が取り上げられています。
> 簡単に解説すると、インターフェイスの継承は「メンバを継承」するのではなく「メンバの実装要求を継承」するだけであるから、らしいですが、煙に巻かれた感じの説明ですね。
>
> 一番簡単なのは、IInterfaceB に
> new int Col1 {get; set;}
> を追加することでしょう。

やはりIInterfaceBのほうで対処する必要があるんですね。
試してみたところ値がとれるようになったので、こちらの方法で対応することにしました。
どうもありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -