DataGridView单元格编辑及按钮查询数据库时程序卡顿求助
嘿,我看你遇到了点击按钮后程序卡顿的问题——这几乎肯定是因为你把数据库查询这类耗时操作直接放在UI线程里执行了!UI线程本来要负责界面渲染、响应用户点击这些事儿,一旦被耗时的数据库操作占住,就没法处理其他交互,自然会出现卡顿甚至假死的情况。
咱们先拆解问题根源:你在dataGridView1_CellEndEdit这个UI线程触发的事件里,直接调用了con.Open()和SqlDataAdapter的同步查询操作,这些操作会阻塞UI线程直到数据库返回结果,这就是卡顿的核心原因。
接下来给你一套可行的解决方案,附上修改后的代码:
1. 改用异步/await执行数据库操作
把事件方法改成异步方法,用await把耗时的数据库操作放到后台线程,让UI线程能持续响应用户交互:
2. 用using语句管理资源
用using包裹数据库连接、数据适配器等资源,确保它们自动释放,避免资源泄漏,也不用手动写Close():
3. 使用参数化查询(必做!)
别用字符串拼接查询条件,参数化查询既能防止SQL注入,也能避免因输入格式导致的查询错误。
修改后的完整代码示例:
// 标记方法为async,支持await异步操作 private async void dataGridView1_CellEndEdit(object sender, DataGridViewCellEventArgs e) { if (e.ColumnIndex == 0) { string newvalue = Search_Product.Text.ToString(); // using自动释放连接资源,不用手动Close using (SqlConnection con = new SqlConnection("替换成你的数据库连接字符串")) { try { // 异步打开连接,不阻塞UI线程 await con.OpenAsync(); // 替换成你的实际表名和查询条件列 string query = "SELECT Product_Code,Rate,SalePrice,CGST,SGST FROM YourTableName WHERE YourConditionColumn = @newvalue"; SqlDataAdapter da = new SqlDataAdapter(query, con); // 添加参数,避免SQL注入和格式错误 da.SelectCommand.Parameters.AddWithValue("@newvalue", newvalue); DataTable dt = new DataTable(); // 把填充DataTable的耗时操作放到后台线程 await Task.Run(() => da.Fill(dt)); // await后自动回到UI线程,直接绑定数据即可 dataGridView1.DataSource = dt; } catch (Exception ex) { // 捕获异常,给用户友好提示 MessageBox.Show($"查询出错:{ex.Message}"); } } } }
额外提醒:
- 如果查询返回的数据量很大,
da.Fill(dt)也会耗时,所以用Task.Run()把这部分也放到后台线程,进一步避免UI阻塞。 - 记得把代码里的
YourTableName、YourConditionColumn和数据库连接字符串替换成你实际的内容。 - 永远不要在UI线程里执行I/O操作(数据库、文件读写、网络请求等),这类耗时操作必须放到后台线程处理。
这样修改后,点击查询时UI不会卡顿,用户还能正常操作界面,直到查询完成后自动更新DataGridView~
内容的提问来源于stack exchange,提问作者Rushabh Y Shah
相关产品推荐
相关产品推荐

