2011-12-30 12 views
0

私は、インターフェイスIDocとその名前のDocを実装する抽象クラスを持っています。 Docから継承したBookDocというクラスとDocから継承した別のクラスのJournalDocがあります。タイプDataGridViewデータソースからキャストBindingList

今私がしたいのは、BindingList<BookDoc>またはBindingList<JournalDoc>のいずれかをカスタムDataGridViewにバインドすることです。私は、Docクラスから継承したErrorsプロパティにアクセスしたいと考えています。

セミ例を作業:

var dataSource = this.DataSource as BindingSource; 

BindingList<BookDoc> tempBookDocs = dataSource.DataSource as BindingList<BookDoc>; 

var Docs = new List<IDoc>(); 

foreach (var tempDoc in tempBookDocs) 
{ 
    Docs.Add(tempDoc); 
} 

上記の例では、動作し、私が移入されるドキュメントのリストを取得し、私はErrorsプロパティにアクセスするが、まだハードコードにもともとバインドされたリストの型を持つことができます。

私はそれが可能であるかどうかはわかりませんが、このようなものです。

var dataSource = this.DataSource as BindingSource; 

BindingList<Doc> Docs = dataSource.DataSource as BindingList<Doc>; 

これは私にはドキュメントのリストがnullになります。

答えて

2

あなたは.NET 4.0を使用している場合は、IEnumarable<>を使用してcovarianceを利用することができます。

IEnumarable<Doc> tempBookDocs = dataSource.DataSource as IEnumarable<Doc>; 

var Docs = new List<IDoc>(); 

foreach (var tempDoc in tempBookDocs) 
{ 
    Docs.Add(tempDoc); 
} 

は、.NET 3.5を使用している場合は、LINQ OfType拡張メソッドを使用することができます

IEnumarable<Doc> myDocs = ((IEnumarable)dataSource.DataSource).OfType<Doc>(); 

var Docs = new List<IDoc>(); 

foreach (var tempDoc in myDocs) 
{ 
    Docs.Add(tempDoc); 
} 
+0

ありがとう私はそれが必要なものを正確に行います –

関連する問題