2014-02-12 33 views
0

我不認爲我甚至會問這個問題,但是在這裏。 我有一個.NET CF應用程序,顯示信息的數據網格。這個應用程序通過TCP套接字連接到將定期廣播數據的中央服務器。在TCP套接字上接收數據後更新用戶界面

如何讓我的數據網格在我的ShellForm上進行更新。在我的DAL中發生套接字事件時,感覺有錯誤需要引用我的ShellForm。

我會使用委託還是異步回調?只是尋找一點指導。謝謝!

回答

2

DAL只能publish an Event,然後GUI可以訂閱它。
引用(和依賴)將從GUI到DAL。

請注意您的線程安全。

+0

我可以製作我自己的活動嗎?謝謝!我會圍繞谷歌。 Compact Framework的任何原因都會使這變得更加困難?迄今爲止,我的經歷就是爲什麼我問。很難找到有關CF的信息,但如果我不需要,那就更好了。 –

+0

CF只是有點舊,不受歡迎。事件應該照常運作。我會添加一個鏈接。 –

+0

謝謝,我認爲這很好解答。我遇到了麻煩,但我認爲這與我的DAL在這種情況下是「靜態」有關。這只是爲了發送各種Socket寫入。無論如何,實現這個作爲一個靜態事件,但當它去更新UI時,我得到一個'System.NotSupportedException:必須使用Control.Invoke ...' –

2

我建議你的用戶界面不應該知道你的DAL。我會爲此做的是創建一箇中間的「演示者」類,觀看DAL,然後可以通過事件,回調或其他方式通知UI。

我很可能會創建一個實現INotifyPropertyChanged的演示者類,它可以讓您直接觀看事件或將數據綁定到您用來填充網格的屬性。演示者還將處理UI上下文的封送處理,因此UI或DAL都不必擔心。

某種形式的僞代碼可能看起來像這樣。記住我的代碼中有各種各樣的基礎設施,所以這不太可能只是編譯,但它應該給我一個我如何解決問題的風味。

class PointPresenter : INotifyPropertyChanged 
{ 
    private IDataService DAL { get; set; } 

    protected Control EventInvoker { get; private set; } 

    public PointPresenter() 
    { 
     // get your DAL reference however you'd like 
     DAL = RootWorkItem.Services.Get<IDataService>(); 
     EventInvoker = new Control(); 
     // this is required to force the EE to actually create the 
     // control's Window handle 
     var h = EventInvoker.Handle; 
    } 

    protected void RaisePropertyChanged(string propertyName) 
    { 
     try 
     { 
      if (m_disposed) return; 

      EventInvoker.BeginInvokeIfRequired(t => 
      { 
       try 
       { 
        PropertyChanged.Fire(this, propertyName); 

       } 
       catch (Exception e) 
       { 
        Debug.WriteLine(e); 
       } 
      }); 
     } 
     catch (ObjectDisposedException) 
     { 
      // if the Form to which we're sending a message is disposed, 
      // this gets thrown but can safely be ignored 
     } 
     catch (Exception ex) 
     { 
      // TODO: log this 
     } 
    } 

    public int MyDataValue 
    { 
     get { return DAL.Data; } 
     set 
     { 
      if (value == MyDataValue) return; 
      DAL.Data = value; 
      RaisePropertyChanged("MyDataValue"); 
     } 
    } 
} 
+0

偉大的代碼,但它不是一個初學者超大? – josef

+0

我完全不同意。實際上,初學者是需要*看到更好的體系結構的人,而不是像在每本書和教程中看到的由設計師生成的UI代碼中的直接DAL訪問那樣的東西,因爲這只是簡化了代碼並且破壞了更快的代碼那個習慣越好越好。 – ctacke

相關問題