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

无法将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框架,能帮你彻底简化数据库操作:

  1. 不用手写繁琐的SQL语句和参数化查询,避免SQL注入风险;
  2. 让数据层和UI层解耦,代码更易维护;
  3. 结合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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:00:17