zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    00 学习资源整理
    07 MySQL的应用层调整,查询缓存设置,内存管理设置,并发参数的设置常识
    06 SQL语句编写优化
    05 Java的ReentrantLock与线程的顺序控制
    05 索引的使用常识(如何编写SQL语句避免索引失效)
    04 MYSQ的SQL优化需要了解的工具explain,profile,trace
    04 JAVA中park/unpark的原理以及JAVA在API层面线程状态总结
    03 MYSQL的体系结构以及存储引擎的基本知识
    02 链表编程题
    01 栈与队列
  • 原文地址:https://www.cnblogs.com/stoneWl/p/11018519.html
Copyright © 2011-2022 走看看