Silverlight实例教程7:Silverlight传递DataTable解决方案(3)
Code void service_GetDataCompleted(object sender, GetDataCompletedEventArgs e) { if (e.Result.IsSucc) { dialogGrid.Children.Clear(); DataVisio dv = new DataVisio(); dv.OnOK += new RoutedEventHandler(d
Code
void service_GetDataCompleted(object sender, GetDataCompletedEventArgs e)
{
if (e.Result.IsSucc)
{
dialogGrid.Children.Clear();
DataVisio dv = new DataVisio();
dv.OnOK += new RoutedEventHandler(dv_OnOK);
DataSetData dsd = e.Result.ReturnValue;
List<object> result = dsd.ToDataSource();
dv.DataContainer.ItemsSource = result;
dialogGrid.Children.Add(dv);
WindowHelper.HideLoading();
dv.Visibility = Visibility.Visible;
}
else
{
WindowHelper.HideLoading();
WindowHelper.Alert(e.Result.ErrorMessage);
}
}
可以看到主要的处理逻辑被封装在DataSetData的扩展方法:ToDataSource()中,这里代码就不贴了,读者可以结合本贴看看里面的具体实现步骤。主要就是先在缓存中根据MetaData的唯一标识查找动态生成的类实例,如果没有找到那么就启动动态编译并把生成的实例加入缓存以备下次再用。要说一下的是这个缓存其实就是定义在App中的字典字段:
Code
public partial class App : Application,ISessionApp
{ #region Prop private Dictionary<string, object> session =
new Dictionary<string, object>();
private Dictionary<string, Type> tempClassDic =
new Dictionary<string, Type>();
只不过通过WindowHelper进行了引用。WindowHelper.TempClassDic。
最后要提醒读者,到这里这个解决方案并不完美,因为我们没有考虑数据量的问题。当数据量很大时WCF传递数据会有问题。我们可以将DataSetData中的List<List<object>>数据的形式改为Byte[]并进行压缩再传递(或者是JSON),这样的话SL端又多了一道加压缩的过程。但个人认为这并不是最完善的解决方法。最终突破数据量的问题可能最好的还是分块传递。可能用到WCF双向通讯的技术。这方面有经验的朋友可以分享一下经验。
精彩图集
精彩文章