You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#中点击按钮如何更新绑定SQL Server的DataGridView数据

问题根因

你的更新按钮无法刷新数据有两个核心问题:

  1. 代码只是重复绑定内存中已有的旧DataTable对象,完全没有重新向SQL Server发起查询拉取最新数据,内存里的数据还是第一次加载时的旧内容,自然不会有变化。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 17:42:43