WPF DataGrid首行修改后数据库未更新问题求助
解决WPF DataGrid首行按钮修改后数据库不更新的问题
嘿,我看了你遇到的问题——首行的界面能正常修改,但数据库里的对应条目就是不更新,其他行却没问题。这事儿我之前也碰到过,咱们来一步步搞定它:
问题根源分析
你现在是通过datagrid1.SelectedItem来获取当前行的数据,这个方式其实有个隐藏坑:如果用户直接点按钮而没先选中整行,SelectedItem可能压根不是当前按钮所在的行(不过你说首行界面能改,说明这次是拿到了行,但大概率是行的状态没被正确标记,或者SqlDataAdapter没识别到这个变更)。另外还有个高频踩坑点:如果你的mytable没设主键,SqlCommandBuilder根本生成不了有效的更新命令,这会直接导致更新失效,首行刚好撞上了这个情况。
具体解决方案
1. 换一种可靠的方式获取当前行
别再依赖SelectedItem了,直接从按钮的DataContext拿当前行才是最稳妥的——每个按钮的DataContext默认就是它所在行的数据对象:
private void button1_Click(object sender, RoutedEventArgs e) { try { // 把sender转换成按钮,获取它的DataContext(当前行数据) Button clickedBtn = sender as Button; if (clickedBtn == null) return; DataRowView currentRow = clickedBtn.DataContext as DataRowView; if (currentRow == null) return; // 你的原有修改逻辑 if (currentRow[1].ToString() == "xxx1") { currentRow[1] = ""; } else { currentRow[1] = "xxx1"; } // 手动标记行状态为Modified,确保DataAdapter能识别到变更 currentRow.Row.SetModified(); // 执行数据库更新 sqldatadapter1.Update((DataTable)bindingSource1.DataSource); CollectionViewSource.GetDefaultView(datagrid1.ItemsSource).Refresh(); } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }
2. 必须给数据库表加主键
这是重中之重!如果你的mytable没有主键列(比如一个自增的ID列),SqlCommandBuilder根本生成不了正确的UpdateCommand——DataAdapter不知道要更新哪一行,自然就不会同步到数据库。赶紧去检查你的表结构,加上主键,这不仅能解决当前问题,也是数据库设计的基本要求。
3. 验证UpdateCommand是否生成成功
你可以在更新前加一行代码,看看SqlDataAdapter的UpdateCommand是不是正常生成了:
// 输出UpdateCommand的SQL语句,检查是否有效 Console.WriteLine(sqldatadapter1.UpdateCommand?.CommandText);
如果输出是null,那100%是因为表没有主键,赶紧补加主键就好。
额外的优化建议
- 建议把DataGrid的ItemsSource绑定到
bindingSource1,而不是table1.DefaultView,这样数据同步会更稳定:datagrid1.ItemsSource = bindingSource1; - 操作数据库的时候记得用
using语句包裹SqlConnection,避免资源泄漏(你当前的代码里打开连接后没关闭,这是个隐患):using (SqlConnection MyConn = new SqlConnection(connString2)) { MyConn.Open(); sqldatadapter1.SelectCommand = new SqlCommand("select * from mytable", MyConn); cmbl = new SqlCommandBuilder(sqldatadapter1); sqldatadapter1.Fill(table1); bindingSource1.DataSource = table1; datagrid1.ItemsSource = bindingSource1; }
按照上面的步骤改完,首行的数据库更新应该就能正常工作了。
内容的提问来源于stack exchange,提问作者Raphael Rieber
相关产品推荐
相关产品推荐

