XPOまわりで、以下のブログ記事が出ていました。
内容は、次バージョンのSneak Peekです。
- XPO – 11.1 Sneak Peek – IDataStore WCF Service in Silverlight
上記の記事の内容は、XPOを利用してWCFサービスを作成し、それをSilverlightから
利用するという内容なのですが、コード内にて以下の事を行っていました。
XPQueryのEnumerateAsyncメソッドを利用して、データを非同期で取得してグリッドに設定している。
内容を見ると、普通にWinFormsとかでも利用できるやんって思って
試してみました。これ、何気に便利。
以下サンプルです。
フォームにGridControlを配置しており、ローディング中が分かるように
フォームの真ん中にラベルを貼り付けています。
出来るだけデータは大量にあった方がいいので、DemoCenterのサーバーモード用データベースを
利用しています。
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; using System.Windows.Forms; using DevExpress.Xpo; using DevExpress.Xpo.DB; namespace WindowsFormsApplication1 { public partial class Form1 : Form { private Session _session; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { Task.Factory.StartNew(() => { XpoDefault.DataLayer = XpoDefault.GetDataLayer( MSSqlConnectionProvider.GetConnectionString(@".\SQLEXPRESS", @"ServerModeGridProjects"), AutoCreateOption.SchemaAlreadyExists ); _session = new Session(); _session.UpdateSchema(typeof(ServerModeGridProjects.ServerSideGridTest)); Invoke(new MethodInvoker(BeginInitializeDataSource), null); }); FormClosing += (s1, e1) => { _session.Dispose(); }; } private void BeginInitializeDataSource() { var xpQuery = new XPQuery<ServerModeGridProjects.ServerSideGridTest>(_session); var query = from item in xpQuery where item.Subject.Contains("Main") && item.HasAttachment orderby item.From select item; query.EnumerateAsync(EndInitializeDataSource); } private void EndInitializeDataSource(IEnumerable<ServerModeGridProjects.ServerSideGridTest> result, Exception ex) { lblLoading.Visible = false; grdMain.DataSource = result; } } }
実行すると、最初はローディング状態の表示となります。
この状態は、非同期でデータを取得している最中ですのでUIスレッドは
ブロックされていません。(BeginInitializeDataSource)
データの取得が完了すると、グリッドにデータが表示されます。(EndInitializeDataSource)
サンプルを以下の場所にアップしました。
試してみたい方はどうぞ。
================================
過去の記事については、以下のページからご参照下さい。
いろいろ備忘録日記まとめ
http://sites.google.com/site/gsfzero1/