WinForm查询大数据界面假死,使用异步调用解决

针对WinForm应用中使用DataGridView控件展示大量数据导致界面卡顿的问题,通过异步查询和后台数据绑定的方法进行了优化,显著提升了用户体验。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

用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日

转载于:https://www.cnblogs.com/sochishun/p/7168815.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值