我不認爲我甚至會問這個問題,但是在這裏。 我有一個.NET CF應用程序,顯示信息的數據網格。這個應用程序通過TCP套接字連接到將定期廣播數據的中央服務器。在TCP套接字上接收數據後更新用戶界面
如何讓我的數據網格在我的ShellForm上進行更新。在我的DAL中發生套接字事件時,感覺有錯誤需要引用我的ShellForm。
我會使用委託還是異步回調?只是尋找一點指導。謝謝!
我不認爲我甚至會問這個問題,但是在這裏。 我有一個.NET CF應用程序,顯示信息的數據網格。這個應用程序通過TCP套接字連接到將定期廣播數據的中央服務器。在TCP套接字上接收數據後更新用戶界面
如何讓我的數據網格在我的ShellForm上進行更新。在我的DAL中發生套接字事件時,感覺有錯誤需要引用我的ShellForm。
我會使用委託還是異步回調?只是尋找一點指導。謝謝!
DAL只能publish an Event,然後GUI可以訂閱它。
引用(和依賴)將從GUI到DAL。
請注意您的線程安全。
我建議你的用戶界面不應該知道你的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");
}
}
}
我可以製作我自己的活動嗎?謝謝!我會圍繞谷歌。 Compact Framework的任何原因都會使這變得更加困難?迄今爲止,我的經歷就是爲什麼我問。很難找到有關CF的信息,但如果我不需要,那就更好了。 –
CF只是有點舊,不受歡迎。事件應該照常運作。我會添加一個鏈接。 –
謝謝,我認爲這很好解答。我遇到了麻煩,但我認爲這與我的DAL在這種情況下是「靜態」有關。這只是爲了發送各種Socket寫入。無論如何,實現這個作爲一個靜態事件,但當它去更新UI時,我得到一個'System.NotSupportedException:必須使用Control.Invoke ...' –