2010-07-09 113 views
1

我遇到了通過WCF RIA服務進行更新後刷新頁面數據的問題。WCF RIA服務問題更新

我在頁面上有一個組合框和一個按鈕。用戶從ComboBox中選擇一個項目,然後單擊該按鈕。這可以軟刪除數據庫中的項目(設置「Active」= false)。但是,我希望在更新完成後將其從ComboBox中刪除。這是我的問題所在。

InventorySystemDomainContext context = new InventorySystemDomainContext(); 

private void btnDelete_Click(object sender, RoutedEventArgs e) 
{ 
    Cigarette c = cboCigarette.SelectedItem as Cigarette; 
    c.Active = false; 

    SubmitOperation so = context.SubmitChanges(); 
    so.Completed += delegate (object s, EventArgs es) 
    { 
     LoadComboBox(); 
    } 
} 

private void LoadComboBox() 
{ 
    cboCigarettes.DataSource = null; 
    cboCigarettes.DataSource = context.Cigarettes; 
    context.Load(context.GetCigarettesQuery()); 
} 

當單擊刪除按鈕時,所有代碼都會運行。但是,刪除的項目仍然在ComboBox中(即使記錄已在數據庫中更新)。如果我刷新頁面,該項目將從ComboBox中消失。

任何想法?

PS:我從內存中寫了這段代碼,因爲我沒有代碼。所以我可能已經忘記了一條線,但我想我已經得到了所有相關的線。

+0

不context.GetCigarettesQuery()返回查詢結果集從非活動排除項目? (就像Cigarettes.Where(c =>!c.Active)) – STO 2010-07-09 17:36:28

+0

是的。 'LoadComboBox'方法在Window_Loaded事件中執行。當我在刪除後刷新頁面時,刪除的項目現在從ComboBox中消失。我希望在不刷新整個頁面的情況下發生這種情況。 – 2010-07-09 17:53:12

回答

3

您是否嘗試將ComboBox.ItemsSource設置爲Entities集合從Load方法返回? EntitySets(context.Cigarettes)正在聚合(它們包含來自多個負載的數據),而LoadOperation.Entities則不是(它只包含來自它所代表的負載的數據)。

+0

我還沒有嘗試過。我不知道有什麼區別。我會嘗試。 – 2010-07-10 01:17:05

+1

該解決方案的缺點是網格「閃爍」/完全重新加載。調用SubmitChanges時,調用集合上的Remove會導致實體被刪除。不知道你是否可以拆除有問題的實體,然後將其刪除....只是大聲思考。 – 2011-05-12 15:17:46

0

接受的解決方案的問題是集合現在已斷開連接,這與內置的添加和刪除綁定項目的優雅混亂。

也許一個更好的解決辦法是,拆下後柔軟有問題的實體刪除

InventorySystemDomainContext context = new InventorySystemDomainContext(); 

private void btnDelete_Click(object sender, RoutedEventArgs e) 
{ 
    Cigarette c = cboCigarette.SelectedItem as Cigarette; 
    c.Active = false; 

    SubmitOperation so = context.SubmitChanges(OnCigaretteSaved, null); 
} 

private void OnCigaretteSaved(SubmitOperation so) 
{ 
    context.Cigarettes.Detach(context.Cigarettes.Where(item => item.Active == false).First()); 
} 

private void LoadComboBox() 
{ 
    cboCigarettes.DataSource = null; 
    cboCigarettes.DataSource = context.Cigarettes; 
    context.Load(context.GetCigarettesQuery()); 
}