救急!! DatagridView绑定datatable数据,界面卡死!!如何解决??

tasmanqi 2020-05-06 01:35:36
只要运行到dataGridView3.DataSource = dt3,UI界面就卡死了

private void BtQueryByDate_ET_Click(object sender, EventArgs e)
{
if (!string.IsNullOrEmpty(cbETModelList.Text))
{
try
{
string starttime = dtpETStarttime.Value.ToString("yyyy/MM/dd HH:mm:ss.fff");
string Endtime = dtpETEndtime.Value.ToString("yyyy/MM/dd HH:mm:ss.fff");
string QueryCmd = "Select * from [老化_" + cbETModelList.Text + "] where [测试日期] Between '" + starttime + "' AND '" + Endtime + "' order by 测试日期 ASC";


dt3 = mSQLServer.SqlClass.ReadDataTable(QueryCmd, DataClass.Sqlconn);
dataGridView3.DataSource = null;
dataGridView3.DataSource = dt3;
}
catch
{
MessageBox.Show("未查询到记录");
}

}
else
{
MessageBox.Show("请先选择料号");
}
}
...全文
1111 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
tasmanqi 2020-05-09
  • 打赏
  • 举报
回复
感谢各位大神的回复,目前问题已经解决。我的程序里面有一行代码让datagridview每插入一行就resizing一次。所以卡死了。我把这行代码取消就行了。 也给后面的网友提个醒,datagridview绑定datatable时,一定要把datagridview所有autoresizing属性全部关掉。并且在做多线程的时候,一定要把datatable的插入记录过程也放在委托内。因为dgv绑定了datatable,那么datatable也是窗体控件的一部分了,对datatable的修改一定要放在委托内。 其实20000条左右的数据量datagridview还是毫无压力的,不需要做分页和异步回调。我还是把异步回调的代码贴在这里吧。 private void DataGridViewInvokeFill(string QueryCmd,DataGridView dataGridView) { Func<DataTable> QueryData = () => { DataTable dt = mSQLServer.SqlClass.ReadDataTable(QueryCmd, DataClass.Sqlconn); return dt; }; QueryData.BeginInvoke((Result) => { DataTable dtResult = QueryData.EndInvoke(Result); dataGridView.BeginInvoke(new Action<DataTable>((DataTable datas) => { dataGridView.DataSource = datas; }), dtResult); }, null); } private void BtQueryByDate_ET_Click(object sender, EventArgs e) { dataGridView3.DataSource = null; dataGridView3.ScrollBars = ScrollBars.None; btQueryByDate_ET.Text = "查询中"; btQueryByDate_ET.Enabled = false; if (!string.IsNullOrEmpty(cbETModelList.Text)) { string starttime = dtpETStarttime.Value.ToString("yyyy/MM/dd HH:mm:ss.fff"); string Endtime = dtpETEndtime.Value.ToString("yyyy/MM/dd HH:mm:ss.fff"); string QueryCmd = "Select * from " + cbETModelList.Text + "] where [测试日期] Between '" + starttime + "' AND '" + Endtime + "' order by 测试日期 ASC, 序号 ASC"; dt3 = mSQLServer.SqlClass.ReadDataTable(QueryCmd, DataClass.Sqlconn); try { DataGridViewInvokeFill(QueryCmd, dataGridView3); } catch(Exception ex) { throw ex; } } else { MessageBox.Show("请先选择料号"); } dataGridView3.ScrollBars = ScrollBars.Vertical; btQueryByDate_ET.Text = "查询"; btQueryByDate_ET.Enabled = true; }
tasmanqi 2020-05-09
  • 打赏
  • 举报
回复
感谢各位大神的回复,目前问题已经解决。我的程序里面有一行代码让datagridview每插入一行就resizing一次。所以卡死了。我把这行代码取消就行了。 也给后面的网友提个醒,datagridview绑定datatable时,一定要把datagridview所有autoresizing属性全部关掉。并且在做多线程的时候,一定要把datatable的插入记录过程也放在委托内。因为dgv绑定了datatable,那么datatable也是窗体控件的一部分了,对datatable的修改一定要放在委托内。 其实20000条左右的数据量datagridview还是毫无压力的,不需要做分页和异步回调。我还是把异步回调的代码贴在这里吧。 private void DataGridViewInvokeFill(string QueryCmd,DataGridView dataGridView) { Func<DataTable> QueryData = () => { DataTable dt = mSQLServer.SqlClass.ReadDataTable(QueryCmd, DataClass.Sqlconn); return dt; }; QueryData.BeginInvoke((Result) => { DataTable dtResult = QueryData.EndInvoke(Result); dataGridView.BeginInvoke(new Action<DataTable>((DataTable datas) => { dataGridView.DataSource = datas; }), dtResult); }, null); } private void BtQueryByDate_ET_Click(object sender, EventArgs e) { dataGridView3.DataSource = null; dataGridView3.ScrollBars = ScrollBars.None; btQueryByDate_ET.Text = "查询中"; btQueryByDate_ET.Enabled = false; if (!string.IsNullOrEmpty(cbETModelList.Text)) { string starttime = dtpETStarttime.Value.ToString("yyyy/MM/dd HH:mm:ss.fff"); string Endtime = dtpETEndtime.Value.ToString("yyyy/MM/dd HH:mm:ss.fff"); string QueryCmd = "Select * from " + cbETModelList.Text + "] where [测试日期] Between '" + starttime + "' AND '" + Endtime + "' order by 测试日期 ASC, 序号 ASC"; dt3 = mSQLServer.SqlClass.ReadDataTable(QueryCmd, DataClass.Sqlconn); try { DataGridViewInvokeFill(QueryCmd, dataGridView3); } catch(Exception ex) { throw ex; } } else { MessageBox.Show("请先选择料号"); } dataGridView3.ScrollBars = ScrollBars.Vertical; btQueryByDate_ET.Text = "查询"; btQueryByDate_ET.Enabled = true; }
dbaren 2020-05-09
  • 打赏
  • 举报
回复 1
用多线程啊, 单独启一个线程获取数据,绑定数据, 主线程就是把form给show出来, 这样就会异步绑定数据了, 界面不会卡死,给人的体验比较好
道斯 2020-05-08
  • 打赏
  • 举报
回复
winform的吧?如果是就是数据了太大了!
飞天凤凰601 2020-05-08
  • 打赏
  • 举报
回复
引用 13 楼 tasmanqi 的回复:
引用 12 楼 飞天凤凰601 的回复:
对了,你数据作索引没有?别告诉我, 你没有
什么叫数据索引
看来你真没做呀!快去扫盲,不然你以后会死掉的 慢的原因终于知道了
牧歌ing 2020-05-07
  • 打赏
  • 举报
回复
列不多吧,行多的话就分页显示啊
写这个事件中CellValueNeeded
Tiny~ 2020-05-06
  • 打赏
  • 举报
回复
用backgroundworker,至少表面上看起来有一个loading会好些
tasmanqi 2020-05-06
  • 打赏
  • 举报
回复
引用 11 楼 飞天凤凰601 的回复:
1、把你同样的SQL语句拿到sqlserver等数据库环境里去测试,看数据多久能出来 2、改变SQL语句,少查一点数据,看你界面会不会卡死;如果卡死,找程序BUG;如果不卡死,就是你只能再找问题了
数据少的时候,没有问题,数据量越大,UI界面响应的时间越长,目前我查的数据量大概2000条,然后UI界面大概需要800秒才能响应完成
tasmanqi 2020-05-06
  • 打赏
  • 举报
回复
引用 12 楼 飞天凤凰601 的回复:
对了,你数据作索引没有?别告诉我, 你没有
什么叫数据索引
飞天凤凰601 2020-05-06
  • 打赏
  • 举报
回复
对了,你数据作索引没有?别告诉我, 你没有
飞天凤凰601 2020-05-06
  • 打赏
  • 举报
回复
1、把你同样的SQL语句拿到sqlserver等数据库环境里去测试,看数据多久能出来 2、改变SQL语句,少查一点数据,看你界面会不会卡死;如果卡死,找程序BUG;如果不卡死,就是你只能再找问题了
ManBOyyy 2020-05-06
  • 打赏
  • 举报
回复
引用 8 楼 tasmanqi 的回复:
[quote=引用 7 楼 ManBOyyy 的回复:] [quote=引用 6 楼 tasmanqi 的回复:] [quote=引用 4 楼 ManBOyyy的回复:] string QueryCmd = "Select * from [老化_" + cbETModelList.Text + "] where [测试日期] Between '" + starttime + "' AND '" + Endtime + "' order by 测试日期 ASC"; 改為 string QueryCmd = "Select top 10 * from [老化_" + cbETModelList.Text + "] where [测试日期] Between '" + starttime + "' AND '" + Endtime + "' order by 测试日期 ASC"; 看看卡不卡
数据量2000条[/quote] 在數據庫查詢這段語句多久》?[/quote]查询数据库很快,只花了几毫秒[/quote] 那你可以調啊,比如顯示一條記錄,100條記錄,然後還是比較慢,然後換一下控件啊,datagridview還有listview都試一下,還有不是本機測試還要測試網絡速度的
良朋 2020-05-06
  • 打赏
  • 举报
回复
可以看看这个博文 https://blog.csdn.net/Q215046120/article/details/104570522 本人没有用过ReadDataTable,一般是用adapter, adapter.Fill(dt)。
tasmanqi 2020-05-06
  • 打赏
  • 举报
回复
引用 7 楼 ManBOyyy 的回复:
[quote=引用 6 楼 tasmanqi 的回复:] [quote=引用 4 楼 ManBOyyy的回复:] string QueryCmd = "Select * from [老化_" + cbETModelList.Text + "] where [测试日期] Between '" + starttime + "' AND '" + Endtime + "' order by 测试日期 ASC"; 改為 string QueryCmd = "Select top 10 * from [老化_" + cbETModelList.Text + "] where [测试日期] Between '" + starttime + "' AND '" + Endtime + "' order by 测试日期 ASC"; 看看卡不卡
数据量2000条[/quote] 在數據庫查詢這段語句多久》?[/quote]查询数据库很快,只花了几毫秒
ManBOyyy 2020-05-06
  • 打赏
  • 举报
回复
引用 6 楼 tasmanqi 的回复:
[quote=引用 4 楼 ManBOyyy的回复:] string QueryCmd = "Select * from [老化_" + cbETModelList.Text + "] where [测试日期] Between '" + starttime + "' AND '" + Endtime + "' order by 测试日期 ASC"; 改為 string QueryCmd = "Select top 10 * from [老化_" + cbETModelList.Text + "] where [测试日期] Between '" + starttime + "' AND '" + Endtime + "' order by 测试日期 ASC"; 看看卡不卡
数据量2000条[/quote] 在數據庫查詢這段語句多久》?
tasmanqi 2020-05-06
  • 打赏
  • 举报
回复
引用 4 楼 ManBOyyy的回复:
string QueryCmd = "Select * from [老化_" + cbETModelList.Text + "] where [测试日期] Between '" + starttime + "' AND '" + Endtime + "' order by 测试日期 ASC"; 改為 string QueryCmd = "Select top 10 * from [老化_" + cbETModelList.Text + "] where [测试日期] Between '" + starttime + "' AND '" + Endtime + "' order by 测试日期 ASC"; 看看卡不卡
数据量2000条
tasmanqi 2020-05-06
  • 打赏
  • 举报
回复
引用 2 楼 lich2005的回复:
那个 select 语句得到的数据集大小如何,如果数据很多的话,自然很卡。另外那个连接字符串的变量,在这里是否还能用,变量的作用域有没有过期?
数据量大概2000条
ManBOyyy 2020-05-06
  • 打赏
  • 举报
回复
string QueryCmd = "Select * from [老化_" + cbETModelList.Text + "] where [测试日期] Between '" + starttime + "' AND '" + Endtime + "' order by 测试日期 ASC"; 改為 string QueryCmd = "Select top 10 * from [老化_" + cbETModelList.Text + "] where [测试日期] Between '" + starttime + "' AND '" + Endtime + "' order by 测试日期 ASC"; 看看卡不卡
悠然的二货 2020-05-06
  • 打赏
  • 举报
回复
有没有尝试多等一会?是不是数据量太大了?
lich2005 2020-05-06
  • 打赏
  • 举报
回复
那个 select 语句得到的数据集大小如何,如果数据很多的话,自然很卡。另外那个连接字符串的变量,在这里是否还能用,变量的作用域有没有过期?
加载更多回复(1)

110,567

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧