0

お客様のクラスがあり、子オブジェクトがオーダーであるとします。 Winformsアプリケーションでは、メインフォームをの顧客のリストにバインドすることがあります。メインフォームのグリッドには、お客様の注文が表示されます。独自のコレクションオブジェクトとしてBindingSourceのDataMemberに到達する方法はありますか?

すべての基本的なマスター/ディテールwinforms。 CustomerBindingSource.DataSourceを当社の顧客リストに設定することができます。グリッドのDataSourceでもCustomerBindingSourceで、そのDataMemberは「注文」という文字列です。 Ordersは、Customerのプロパティです。

実行時に、に到達します。グリッドの内容をオーダーの集まりにします。私の場合(さまざまな理由で)グリッドとその内容にアクセスできるだけで、元の顧客にアクセスすることはできません(Customer.Ordersは参照できません)

私はグリッドの注文リストこの疑似コードのようなものを使用してください:

CType(CType(OrdersGrid.DataSource, BindingSource).DataSource, Orders) 

もちろん、これは動作しません。このような古典的なマスター/ディテールフォームでは、グリッドのDataSourceは実際にはCustomerBindingSourceオブジェクトで、注文はDataMemberで、これは文字列としてしかアクセスできません。

届く方法はありますかご注文グリッドからのご注文ですか?

答えて

1

これは、(フリーハンドタイピング)実行する必要があります。

var orders = ordersGrid.Rows.Select(row => row.DataBoundItem).Cast<Order>(); 
+0

私は必要とするものを正確に見ていると思いますが、私は明日私が自分のものの前に戻ったときにそれを正しく見る必要があります。また、@DavidHallは私が勉強する必要があるあなたの答えの洗練されたものを持っています。 – hawbsl

+0

ありがとうございます。.DataBoundItemは私が探していたものです! – hawbsl

1

私はあなたを誤読していない限り、あなたはバインディングソースを流れる電流の顧客にアクセスすることができるはずです。 DataGridViewRowCollectionはIEnumerableを実装していませんので、あなたは彼のコードを変更する必要があるでしょうがあなたはまた、GertArnoldが提案された方法を使用することができます

Customer c = bs.Current as Customer; 

if (c != null) 
{ 
    Orders o = c.Orders; 
} 

var orders = dataGridView1.Rows.Cast<DataGridViewRow>() 
       .Select(row => row.DataBoundItem).Cast<Orders>(); 
+0

私は顧客オブジェクトを介して注文にアクセスしたくありません。それはそのキーです。私は、グリッドから注文リストにアクセスしたいと思います。あなたの答えの第二の部分はしかし、本当に興味深いです。私は明日私の仕事のPCに戻ってくるときにそれを見る必要があります。 – hawbsl

+0

@hawbslなぜバインド元から顧客オブジェクトにアクセスできないのですか?これが標準的な方法です。私はいつもグリッドを通して物事にアクセスすることを避けようとしました。ビジネスロジックをUIコードに結びつけることにつながります。私たちのケースでは、グリッドが顧客に提示されてから経過した時間に、顧客の注文プロパティが変更された可能性があります。 –

+0

グリッドに4つの注文が表示されている場合は、お客様の変更により3または5ではなく4つの注文を表示したいと考えています。 – hawbsl

関連する問題