2012-11-27 13 views
1

我正在努力實現的內容如下: 我有一個下拉列表,其中包含一些來自數據庫的值。我有一些與WorkingUnits相關的材料。因此,我可以將我想要的許多材料分配給一個WorkingUnit,並且將一個和相同的材料分配給兩個不同的WorkingUnits(以防我想這樣做)。到目前爲止這麼好,但是我想要做的更多的事情是爲每個工作單元過濾已經選擇的材料,以便用戶不能再次選擇它們。如何從LightSwitch中的下拉控件中濾除已經選擇的項目?

即興表關係:

|Materials|1 --------- * |MaterialWorkingUnitMap| * ----------- 1 |WorkingUnit| 

我可能會問的一些小事,但我不能想出解決辦法爲止。根據描述的行爲,你的關係是否錯誤?據我所知他們是有道理的,但我對LightSwitch來說是全新的。

另一種解決方案是在用戶選擇一個相同的材料的情況下還包括一些驗證。這是不太需要的方法,但我想它也讓我滿意。

回答

0

在將所選材料項目添加到MaterialWorkingUnitMap的命令中,添加一些從Material集合中移除所選記錄的代碼。通過Lightswitch的數據綁定,這應該立即明顯地從視圖中移除材料記錄。但是,當您調用SaveChanges時,這會導致從數據庫中刪除這些材料記錄,這並不是我想要的。所以爲了避免這種情況,在SaveChanges管道中,您可以在刪除的材料記錄上調用DiscardChanges。

2

我希望這有助於。

轉到您的材料表並創建一個名爲「UnusedMaterialsByWorkingUnit」的新查詢。 在此查詢中,添加1個參數:類型爲Integer的參數WorkingUnitID。 去寫代碼下拉菜單並選擇「UnusedMaterialsByWorkingUnit_PreprocessQuery」

讓你PreprocessQuery是這樣的:

partial void UnusedMaterialsByWorkingUnit_PreprocessQuery(int? WorkingUnitID, ref IQueryable<Material> query) 

{ 
    query = from material in query 
      where !material.MaterialWorkingUnitMaps.Any(c => c.WorkingUnit.Id == WorkingUnitID) 
      select material; 
} 

轉到你有你的下拉菜單屏幕的LightSwitch。 添加數據項...並選擇UnusedMaterialsByWorkingUnit查詢。 在屏幕左側,單擊查詢中的WorkingUnitID並將其數據綁定到屏幕上加載的WorkingUnit.ID。 轉到您的下拉列表並選擇UnusedMaterialsByWorkingUnit集合作爲源。

讓我知道這是否行得通!

+0

這實際上在VS2015中適用於我。澄清你的一些說明;創建新查詢並將其添加爲數據項後,必須將查詢的/ parameter /綁定到映射表中的屬性。然後,點擊下拉菜單並在屬性窗口中找到「選擇」並將選擇更改爲新的查詢。我沒有任何叫做「源」的東西。警告;如果您在一次保存中添加多個項目,則仍然可能會添加重複項目,因爲列表中的「未使用」數據只有在保存時纔會更新。但它比默認更好。 – K0D4

+0

這是一個比接受的更徹底的答案,如果您忘記放棄更改,不會意外刪除記錄。爲我工作得很好(VS 2015,LS HTML) –

相關問題