0

假設我們有一類客戶並且有一個子對象訂單。在我們的Winforms應用程序中,我們可能會將主窗體綁定到Customers的列表。主窗體上的網格列出了客戶的訂單有沒有辦法將BindingSource的DataMember作爲一個集合對象來實現?

這是所有基本的主/明細winforms。我們可以將CustomerBindingSource.DataSource設置爲我們的客戶列表。網格的DataSourceCustomerBindingSource和它的DataMember是一個字符串「訂單」。 OrdersCustomer的財產。

在運行時我想達到作爲訂單集合的網格內容。在我的情況下(由於各種原因)我只能訪問網格及其內容,我沒有訪問原始客戶(所以不能參考Customer.Orders

我想達到網格的訂單列表使用類似這樣的僞代碼:

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

但是,這當然不起作用。在這種經典的Master/Detail表格中,網格的DataSource實際上是CustomerBindingSource對象,而訂單只是DataMember,我只能以字符串的形式訪問。

有沒有辦法達到這個目標訂單通過網格收集?

回答

1

這應該這樣做(寫意打字):

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

謝謝,我認爲這看起來正是我所需要的,但明天當我回到我的面前時,我需要正確看待它。還@DavidHall有一個你需要研究的答案的細化。 – hawbsl

+0

謝謝,.DataBoundItem是我正在尋找! – hawbsl

1

除非我誤解你,那麼你應該能夠通過綁定源訪問當前的客戶。

Customer c = bs.Current as Customer; 

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

您也可以使用該方法GertArnold提出的,雖然你會需要修改自己的代碼,因爲DataGridViewRowCollection沒有實現IEnumerable。

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

我不想通過客戶對象訪問訂單,這是關鍵。我想通過網格訪問訂單列表。然而,你答案的第二部分看起來非常有趣。當我明天回到工作電腦時,我需要看看它。 – hawbsl

+0

@hawbsl你爲什麼不能通過綁定源訪問客戶對象?那將是標準的做法。我一直試圖避免通過網格訪問事物 - 我發現這會導致將業務邏輯耦合到UI代碼。 –

+0

在我們的案例中,客戶的訂單屬性可能在電網提供給客戶後的時間內發生變化。如果網格顯示4個訂單,我們希望顯示4個訂單,而不是3個或5個,因爲客戶有變化。訂購 – hawbsl

相關問題