C# Winfrom异步加载数据防止界面假死

需求如上图所示:界面中有3个数据控件。

第一个数据控件中有两列需要进行单元格编辑。

 1 private void gvforecast_ShowingEditor(object sender, CancelEventArgs e)
 2         {
 3             GridView view = sender as GridView;
 4             string fieldName = view.FocusedColumn.FieldName;
 5             //如果列名是"Forecast"且Locked列值不等于N,则不可以编辑
 6             if ((fieldName == "Forecast"|| fieldName=="WForecast") && !DisableEditCell(view, view.FocusedRowHandle))
 7             {
 8                 e.Cancel = true;
 9             }
10         }
View Code

第二个数据控件和第三个控件为明细数据。

操作要求:进行单元格编辑时同时加载明细数据。

正常操作情况在第一个Grid单元格编辑事件中同时加载数据,但是会出现界面假死状态。只有明细数据加载完成后,单元格才能获取到光标。这样用户体验度不好,为了提高用户体验我想到的解决方案是异步加载明细数据。

关键字:async、await、Task<T>、Task。至于这几个关键字的原理不做解释,直接上代码

1 private Task<DataSet> GetData(string week,string branch,string pol,string schCode)
2         {
3             return Task.Run<DataSet>(() => 
4                    {
5                        return FeederForecastBiz.GetDataSet(week, branch, pol, schCode);
6                    } 
7                 );
8         }
View Code
 1 private async void LoadData(string week, string branch, string pol, string schCode)
 2         {
 3             DataSet ds = await GetData(week, branch, pol, schCode);
 4             if (ds != null)
 5             {
 6                 DataTable tableTeu = ds.Tables["tableTeu"];
 7                 DataTable tableBk = ds.Tables["tableBk"];
 8                 if (tableTeu != null && tableTeu.Rows.Count > 0)
 9                 {
10                     this.gdReceiveTeu.DataSource = tableTeu;
11                     InitGridColumn(gvReceiveTeu);
12                 }
13                 if (tableBk != null && tableBk.Rows.Count > 0)
14                 {
15                     this.gdBk.DataSource = tableBk;
16                     InitGridColumn(gvBk);
17                 }
18             }
19         }
View Code

关键代码如上,然后我们直接调用加载数据方法即可。卡顿现象消除

---------------------------------------------------

Devexpres GridControl列自适应宽度,同时开启滚动条

设置:

AutoColumnWith=false

HorzScrollVisibility:Always

1  private void InitGridColumn(GridView gv)
2         {
3             for (int i = 0; i < gv.Columns.Count; i++)
4             {
5                 gv.BestFitColumns();
6                 gv.Columns[i].BestFit();
7             }
8         }
View Code

 

posted @ 2019-06-14 10:15  stonewl  阅读(1936)  评论(0编辑  收藏  举报