无法将DataGrid选中行存入SQL的DemoTest表,存入内容异常
解决WPF DataGrid选中行存入SQL时出现
System.Windows.Controls.TextBlock的问题 问题根源
你遇到的问题核心是:GetCellContent返回的是DataGrid单元格里的UI控件实例(比如TextBlock),而不是控件绑定的实际业务数据。直接把这个控件对象存入数据库时,SQL会存储它的类型名称(也就是你看到的System.Windows.Controls.TextBlock),这显然不是你想要的结果。
解决方案:优先操作数据对象,而非UI控件
WPF的DataGrid是基于数据绑定设计的,正确的做法是直接获取选中行对应的数据模型实例,而不是去扒UI控件的内容:
假设你的DataGrid绑定的是一个ObservableCollection<InsRepModel>(InsRepModel是你定义的业务数据模型类),可以这样修改代码:
private void btn_SendWorkOrder_Click(object sender, RoutedEventArgs e) { // 把选中行转换为你的数据模型类型 var selectedRows = DataGridInsRep.SelectedItems.Cast<InsRepModel>().ToList(); foreach (var rowData in selectedRows) { DemoTest dTest = new DemoTest(); // 直接取数据模型的属性,这才是真正要存入数据库的内容 dTest.Field1 = rowData.YourProperty1; dTest.Field2 = rowData.YourProperty2; // ... 其他字段 // 这里执行存入SQL的逻辑,比如用SqlCommand或数据库工具类 // 示例(伪代码): // using(var conn = new SqlConnection("你的连接字符串")) // { // conn.Open(); // var cmd = new SqlCommand("INSERT INTO DemoTest VALUES (@f1, @f2)", conn); // cmd.Parameters.AddWithValue("@f1", dTest.Field1); // cmd.Parameters.AddWithValue("@f2", dTest.Field2); // cmd.ExecuteNonQuery(); // } } }
如果非要用GetCellContent(非常不推荐,因为依赖UI结构,后续修改控件类型会直接失效),可以从控件中提取实际值:
var cellControl = DataGridInsRep.GetCellContent(selectedRow); if (cellControl is TextBlock textBlock) { var actualValue = textBlock.Text; // 这才是你要的数据 dTest.Field1 = actualValue; }
关于WPF Entity Framework的使用建议
EF(Entity Framework)是ORM框架,能帮你彻底简化数据库操作:
- 不用手写繁琐的SQL语句和参数化查询,避免SQL注入风险;
- 让数据层和UI层解耦,代码更易维护;
- 结合WPF的MVVM模式,能让整个项目架构更清晰。
如果你的项目还没引入EF,非常建议尝试。用EF实现存入操作的示例代码:
using (var dbContext = new YourDbContext()) // 你的EF上下文类 { var selectedRows = DataGridInsRep.SelectedItems.Cast<InsRepModel>().ToList(); foreach (var rowData in selectedRows) { var demoTest = new DemoTest { Field1 = rowData.YourProperty1, Field2 = rowData.YourProperty2 }; dbContext.DemoTest.Add(demoTest); } dbContext.SaveChanges(); // 一次性提交所有变更 }
总结
GetCellContent本身没有错误,但用它来获取业务数据是舍近求远的做法,完全违背了WPF数据绑定的设计初衷;- 优先直接获取DataGrid选中行对应的数据模型实例,这是最可靠、最符合WPF设计思想的方式;
- 引入EF能大幅提升数据库操作的效率和代码质量,推荐在WPF项目中使用。
内容的提问来源于stack exchange,提问作者farzadini
相关产品推荐
相关产品推荐

