2010-01-10 61 views
0

在後面WPF應用程序的主窗口的文件代碼我有一個方法quering與LINQ一個數據庫SQL和結果寫入到一個ObservableCollection:從另一個窗口調用方法(類)問題

public void GetStateByDate(string shcode) 
    { 
     MydbDataContext contextSts = new MydbDataContext(); 
     _ShAvaQuCollection.Clear(); 

     var sts = from p in contextSts.SAties where p.ShID == shcode select p; 

     foreach (var p in sts) 
      _ShAvaQuCollection.Add(new ShAvaQu 
      { 
       ShCode = p.ShID, 
       SiID = p.SiID, 
       PrCat = p.PrCat 
      }); 
    } 

當我從文件後面的同一代碼(同一個窗口)調用此方法,一切正常。

如果我從另一個調用窗口此方法,使用主窗口的instanse,保持的ObservableCollection空:

SWindow sw = new SWindow(); 
sw.GetStateByDate(stringpar); 

,這是什麼原因呢?在這種情況下,方法是否創建另一個ObservableCollection實例?

(我可以在sw._ShAvaQuCollection包含的值的調試器看到的。是sw._ShAvaQuCollection不徵收相同instanse爲_ShAvaQuCollection?如果是的話,它是如何解決的?)

編輯(添加)

該聲明的ObservableCollection這樣:

ObservableCollection<ShAvaQu> _ShAvaQuCollection = 
      new ObservableCollection<ShAvaQu>(); 

    public ObservableCollection<ShAvaQu> ShAvaQuCollection 
    { get { return _ShAvaQuCollection; } } 

    public class ShAvaQu 
    { 
     public string ShCode { get; set; } 
     public string SiID { get; set; } 
     public int PrCat { get; set; } 
    } 

我打電話從一個窗口方法,在另一個集合ShQuCollection通過ListView顯示。在SelectionChanged事件處理程序我帶參數此數據庫quering:

private void ShSelList_SelectionChanged(object sender, SelectionChangedEventArgs e) 
    {   
     SWindow sw = new SWindow();   
     string str = sw.ShQuCollection[ShSelList.SelectedIndex].ShCode; 
     sw.GetStateByDate(str); 
     Close(); 
    } 
} 
+0

請向我們展示(1)在從另一個窗口調用GetStateByDate時如何訪問ObervableCollection以及(2)_ShAvQuCollection的聲明。 – Heinzi 2010-01-10 17:17:03

+0

謝謝。我已經添加了關於這個 – rem 2010-01-10 17:33:32

回答

2

1)最重要的,你不應該調用數據庫的邏輯從你的窗戶/表格。你應該把它抽象到另一個類中。然後你可以讓你的方法返回一個可觀察的集合。

但在你的情況下,我假設你正在嘗試使用輔助表單來重新加載/加載集合,並且希望它在主窗體上使用。與此問題是你正在創建一個新的窗體實例,所以你的集合正在被填充,但不是在你的主窗體上,而是一個副本。

有幾種方法可以嘗試解決這個問題。

1)使方法成爲靜態的,並且可觀察的集合是靜態的,以便它更新單個實例。

2)將主要表單的實例句柄傳遞給輔助表單,以便重新使用已有的實例。這將是更可取的,這樣你就不會在整個地方創建新的實例。

在第二種形式的構造函數中,您可以傳遞主窗口的實例,以便直接使用它。這應該可以解決你的問題。

更新:這是一些代碼示例。基本上有很多方法可以傳遞參考。從有,你會打開一個窗口,像這樣的方法,你的主要形式

// This is the constructor for your second window 
private Window _parentHandle; 

public SecondWindow(Window obj) 
{ 
    this._parentHandle = obj; 
} 

然後:

你可以用構造像這樣做。現在

SecondWindow w = new SecondWindow(this); 
w.Show(); 

你的第二個窗口中有一個直接的句柄你的第一個窗口,讓你可以叫你上這個變量的方法,它會更新。

另一種方法是在第二個窗口上也有一個公共Setter方法。

public Window ParentContext 
{ 
    get { return this._parentHandle; } 
    set { this._parentHandle = value; } 
} 

然後,你可以這樣創建表單實例:

SecondWindow w = new SecondWindow(); // so just like normal 
w.ParentContext = this; // set the instance to the calling form 
w.Show(); 

這是基礎。這種類型的場景適用於任何需要傳遞參考的場景。

希望有所幫助。

+0

的其他內容謝謝,約書亞!請問您能否在代碼示例中顯示將主表單的實例句柄傳遞到輔助表單的正確方法? – rem 2010-01-10 17:43:41

+0

關於我的情況還有一點要注意:它是WPF應用程序。在這種情況下通過實例句柄是否可能? – rem 2010-01-10 18:35:16

+0

約書亞,謝謝你的幫助! – rem 2010-01-11 14:41:57