zoukankan      html  css  js  c++  java
  • WinForm查询大数据界面假死,使用异步调用解决

    用DataGridView无分页绑定一个几千条数据的查询,查询的时候界面直接卡死十几秒,用户体验非常不好,因此用异步操作解决界面卡死的问题
    原本场景:点击[查询]后,界面直接卡死
    优化场景:点击[查询]后,界面可以随意移动,感觉不到后台在做大量数据的读取和绑定

    private void btnQuery_Click(object sender, EventArgs e)
    {
        // 查询按钮点击后,按钮文本由"查询"改为"加载中",并把按钮状态改为不可点击
        btnQuery.Text = "加载中...";
        btnQuery.Enabled = false;
        // 使用匿名方法定义一个委托事件,委托事件主要操作数据库查询,并返回查询的结果,不涉及任何UI操作    
        Func<DataTable> act = () =>
        {
            string sqlstmt = GetQuerySQL();
            DbParams dbpara = new DbParams(DbFactory.Instance.ProviderName);
            dbpara.AddInputDateTime("@beginTime", dtpStart.Value);
            dbpara.AddInputDateTime("@endTime", dtpEnd.Value);
            DataTable dtUserList = DbFactory.Instance.ExecuteDataTable(sqlstmt, dbpara.ToArray());
            return dtUserList;
        };
        // 异步调用委托事件,在委托事件回调方法中,使用任意控件的异步方法把查询结果绑定到数据表控件中
        act.BeginInvoke((result) =>
        {
            DataTable dtResult = act.EndInvoke(result);
            // this是当前WinForm窗口的实例,也可以替换为界面中的任意控件示例,如dgvMain.BeginInvoke
            this.BeginInvoke(new Action<DataTable>((DataTable dtList) =>
            {
                dgvMain.DataSource = dtList;
                btnQuery.Text = "查询(&Q)";
                btnQuery.Enabled = true;
            }), dtResult);
        }, null);
    }

    WinForm DataGridView显示行头序号代码

    this.dgvMain.RowPostPaint += (object sender, DataGridViewRowPostPaintEventArgs e) =>
    {
        DataGridView dgv = sender as DataGridView;
        SolidBrush b = new SolidBrush(dgv.RowHeadersDefaultCellStyle.ForeColor);
        e.Graphics.DrawString((e.RowIndex + 1).ToString(System.Globalization.CultureInfo.CurrentUICulture), dgv.DefaultCellStyle.Font, b, e.RowBounds.Location.X + 15, e.RowBounds.Location.Y + 7);
    };

    参考文章:
    http://www.cnblogs.com/yuyijq/archive/2010/01/11/1643802.html

    版权声明:本文采用署名-非商业性使用-相同方式共享(CC BY-NC-SA 3.0 CN)国际许可协议进行许可,转载请注明作者及出处。
    本文标题:WinForm查询大数据界面假死,使用异步调用解决
    本文链接:http://www.cnblogs.com/sochishun/p/7168815.html
    本文作者:SoChishun (邮箱:14507247#qq.com | 博客:http://www.cnblogs.com/sochishun/)
    发表日期:2017年7月14日

  • 相关阅读:
    LeetCode链表解题模板
    c++中的new、operator new、placement new
    树的前序、中序、后续、层次遍历的递归和非递归解法
    c++Volatile关键词
    南大算法设计与分析课程OJ答案代码(5)--割点与桥和任务调度问题
    c++右值引用以及使用
    c++选择重载函数
    从4行代码看右值引用
    被遗忘的C结构体打包技术
    南大算法设计与分析课程OJ答案代码(4)--变位词、三数之和
  • 原文地址:https://www.cnblogs.com/sochishun/p/7168815.html
Copyright © 2011-2022 走看看