如何在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
相关产品推荐
相关产品推荐

