C#中点击按钮如何更新绑定SQL Server的DataGridView数据
问题根因
你的更新按钮无法刷新数据有两个核心问题:
- 代码只是重复绑定内存中已有的旧
DataTable对象,完全没有重新向SQL Server发起查询拉取最新数据,内存里的数据还是第一次加载时的旧内容,自然不会有变化。 grid_sotrud.Refresh()方法仅负责触发控件重绘UI,不会主动读取数据源的更新,更不会连接数据库查新数据。
另外你原有加载逻辑存在隐藏bug:多次点击加载按钮时,会反复向ds中添加名为"Sotrud"的同名表,直接抛出异常。
修复方案
核心思路是把数据库查询、数据绑定的逻辑抽成独立的公共方法,不管是首次加载还是点击更新按钮,都调用这个方法重新从库中拉取最新数据,替换掉内存中的旧数据再重新绑定即可。
修正后完整代码
首先把全局变量和公共加载方法定义在窗体类内:
// 数据库连接字符串建议定义为全局常量,方便统一维护 private const string ConnString = "way_on_sql"; private readonly DataSet ds = new DataSet(); /// <summary> /// 从数据库读取sotrud表最新数据,绑定到DataGridView /// </summary> private void BindSotrudData() { // 加载前先移除旧的同名表,避免重复添加表报错 if (ds.Tables.Contains("Sotrud")) { ds.Tables.Remove("Sotrud"); } // using块会自动释放数据库连接、适配器等资源,避免内存泄漏 using (SqlConnection conn = new SqlConnection(ConnString)) { try { DataTable sotrudTable = new DataTable("Sotrud"); SqlDataAdapter adapter = new SqlDataAdapter("SELECT * FROM sotrud", conn); adapter.FillSchema(sotrudTable, SchemaType.Source); adapter.Fill(sotrudTable); ds.Tables.Add(sotrudTable); } catch (Exception ex) { MessageBox.Show($"数据加载出错:{ex.Message}"); return; } } if (ds.Tables.Contains("Sotrud")) { // 先清空原有绑定,解决部分场景下数据源更新但UI不刷新的问题 grid_sotrud.DataSource = null; grid_sotrud.DataSource = ds.Tables["Sotrud"]; grid_sotrud.AutoSizeColumnsMode = DataGridViewAutoSizeColumnsMode.Fill; grid_sotrud.SelectionMode = DataGridViewSelectionMode.FullRowSelect; grid_sotrud.MultiSelect = false; } }
加载按钮点击事件直接调用公共方法即可:
public void load_data_Click(object sender, EventArgs e) { BindSotrudData(); }
更新按钮不需要单独写绑定逻辑,调用同一个方法就能拿到最新数据完成刷新:
private void update_data_Click(object sender, EventArgs e) { BindSotrudData(); }
注意事项
- 不要依赖
Control.Refresh()方法更新数据,它仅重绘控件外观,和数据源刷新没有任何关系。 - 所有实现了
IDisposable接口的数据库相关对象(SqlConnection、SqlDataAdapter等)都建议用using块包裹,自动释放非托管资源。 - 如果后续需要实现修改DataGridView数据后同步回数据库的功能,可以直接给
SqlDataAdapter配置SqlCommandBuilder,调用Update方法即可,不需要手写SQL语句。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

