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

如何在C#中为DataGridView实现刷新按钮?解决数据不更新问题

解决WPF DataGrid新增/删除后无法刷新的问题

我来帮你搞定这个DataGrid刷新的问题!你的核心问题其实很明确:在执行删除或新增操作后,没有重新从数据库拉取最新数据并重新绑定到DataGrid。dgGrid.Items.Refresh()只是刷新现有数据源的UI渲染,数据源本身没更新的话,自然看不到变化。

下面一步步帮你修正代码:

1. 优化数据绑定方法(修复资源泄漏+更简洁)

首先,你的BindDataGrid()方法没有正确释放数据库连接等资源,容易造成连接泄漏。我们用using语句自动管理资源,同时简化逻辑:

private void BindDataGrid()
{
    // using语句会自动释放连接、命令、适配器,避免资源泄漏
    using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnString"].ToString()))
    {
        conn.Open();
        string query = "SELECT * FROM AuctionTbl2";
        using (SqlCommand comm = new SqlCommand(query, conn))
        {
            DataSet ds = new DataSet();
            using (SqlDataAdapter da = new SqlDataAdapter(comm))
            {
                da.Fill(ds);
                // 重新设置ItemsSource,这会自动触发DataGrid更新UI,不需要额外调用Refresh()
                dgGrid.ItemsSource = ds.Tables[0].DefaultView;
            }
        }
    }
}

2. 删除操作后立即刷新DataGrid

你的删除按钮现在只执行了删除SQL,但没有重新绑定数据。修改DeleteBtn_Click,在删除完成后调用BindDataGrid():

private void DeleteBtn_Click(object sender, RoutedEventArgs e)
{
    try
    {
        // 先检查是否选中了行(避免误删所有数据!)
        var selectedRow = dgGrid.SelectedItem as DataRowView;
        if (selectedRow == null)
        {
            MessageBox.Show("请先选择要删除的拍卖项!");
            return;
        }

        // 假设你的表有主键列AuctionId,根据ID删除(用参数化查询防SQL注入)
        int auctionId = (int)selectedRow["AuctionId"];
        
        using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["ConnString"].ToString()))
        {
            conn.Open();
            // 参数化查询更安全,避免SQL注入
            string query = "DELETE FROM AuctionTbl2 WHERE AuctionId = @AuctionId";
            using (SqlCommand comm = new SqlCommand(query, conn))
            {
                comm.Parameters.AddWithValue("@AuctionId", auctionId);
                comm.ExecuteNonQuery();
                MessageBox.Show("删除成功!");
                // 删除后立即重新绑定数据,刷新DataGrid
                BindDataGrid();
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show($"删除失败:{ex.Message}");
    }
}

注意:你原来的删除语句会删除表中所有数据,这肯定不是你想要的!上面的代码改成了删除选中的行,记得根据你的表结构调整主键列名。

3. 新增操作后自动刷新

因为你用ShowDialog()打开新增窗口,窗口关闭后会执行后续代码,所以在窗口关闭后调用BindDataGrid()即可:

private void AddNew_Click(object sender, RoutedEventArgs e)
{
    NewDeleteWindow newDeleteWindow = new NewDeleteWindow();
    newDeleteWindow.DataContext = new NewSaveButton();
    // ShowDialog会等待窗口关闭后继续执行
    newDeleteWindow.ShowDialog();
    // 新增完成后重新绑定数据
    BindDataGrid();
}

4. 添加专门的刷新按钮(可选)

如果你需要一个单独的刷新按钮,只需要在按钮的Click事件里调用BindDataGrid()就行:

private void RefreshBtn_Click(object sender, RoutedEventArgs e)
{
    BindDataGrid();
}

为什么之前的Items.Refresh()没用?

dgGrid.Items.Refresh()的作用是让DataGrid重新渲染现有数据源的内容,但如果你的数据源(DataSet里的表)还是删除/新增前的旧数据,那刷新UI也看不到变化。必须重新从数据库获取最新数据,重新设置ItemsSource,才能让DataGrid显示最新内容。

内容的提问来源于stack exchange,提问作者xVenum.dll

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.12 04:55:58