0

Customerのクラスがあり、 Ordersの子オブジェクトがあるとします。Winforms アプリケーションでは、メイン フォームをCustomersのリストにバインドします。メイン フォームのグリッドには、顧客のOrdersが一覧表示されます。

これはすべて基本的なマスター/詳細の winform です。CustomerBindingSource.DataSourceを顧客リストに設定できます。グリッドDataSourceも文字列「Orders」です CustomerBindingSource。のプロパティです。DataMemberOrdersCustomer

実行時に、注文のコレクションとしてグリッドのコンテンツに到達したいと考えています。私の場合(さまざまな理由で)グリッドとそのコンテンツにしかアクセスできず、元の顧客にはアクセスできません(参照できませんCustomer.Orders

この疑似コードのようなものを使用して、グリッドの注文リストにアクセスしたいと思います。

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

ただし、もちろん、これは機能しません。この種の古典的なマスター/詳細形式でDataSourceは、グリッドの は実際にはCustomerBindingSourceオブジェクトであり、注文は単なる でありDataMember、文字列としてのみアクセスできます。

グリッド経由でそのOrdersコレクションに到達する方法はありますか?

4

2 に答える 2

1

これでうまくいくはずです(フリーハンド入力):

var orders = ordersGrid.Rows.Select(row => row.DataBoundItem).Cast<Order>();
于 2011-10-26T17:20:28.813 に答える
1

読み違えていない限り、バインディング ソースを介して現在の顧客にアクセスできるはずです。

Customer c = bs.Current as Customer;

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

DataGridViewRowCollection は IEnumerable を実装していないため、GertArnold が提案した方法を使用することもできますが、彼のコードを変更する必要があります。

var orders = dataGridView1.Rows.Cast<DataGridViewRow>() 
               .Select(row => row.DataBoundItem).Cast<Orders>();
于 2011-10-26T17:24:46.323 に答える