【问题标题】:Datagrid binding wpf c# to datatable.defaultview: Last column of data missing but header is thereDatagrid将wpf c#绑定到datatable.defaultview:最后一列数据丢失但标题在那里
【发布时间】:2026-01-17 00:25:01
【问题描述】:

我在 net 4 wpf c# 项目中绑定数据网格控件时遇到问题 抱歉,如果我发布的信息太多或不够,我永远猜不到正确的数量

这就是我所拥有的。

1.一个名为 dgCSVData 的数据网格控件,它勾选了自动生成列

我的 xaml 是

<DataGrid ItemsSource="{Binding dgCSVData}" Name="dgCSVData" Height="283" Width="1033" IsEnabled="True" ContextMenuService.ShowOnDisabled="True" IsReadOnly="True" SelectionChanged="dgCSVData_SelectionChanged" >
    <DataGrid.ContextMenu>
        <ContextMenu>
            <MenuItem Command="Copy">
                <!--<MenuItem.Icon>
                    <Image Source="Images/copy.png" />
                </MenuItem.Icon>-->
            </MenuItem>
        </ContextMenu>
    </DataGrid.ContextMenu>
</DataGrid>
  1. 我正在将一个 csv 读入一个列表并使用该列表创建一个从我的 sql 数据库克隆的数据表。数据表在后台阅读器中创建并交回主线程。我循环浏览了表数据行中的项目,并确认数据表返回了正确的信息:这是调试输出的表中的一行

年份项目:2013/14,从项目:12/10/2013 00:00:00,到项目:18/10/2013 00:00:00,周无项目:27,时钟无项目:1139,名称项目:SINGH,初始项目:R,部门项目:1,自己小时项目:55.50,其他小时项目:0.00,总小时项目:55.50,O/T 高级项目:7.92

我用这段代码设置(或者更确切地说是尝试)设置数据网格的内容

void objProgress_ValueChanged(DataTable Result,string msg)
{
    //Handle the event of csv datatable ready to return
    oTable = Result;

    //this is just for debug
    DataRow Dr = oTable.Rows[0];
    foreach (var item in Dr.ItemArray)
    {
        System.Windows.Forms.MessageBox.Show(item.ToString());
    }

    //this meant to set the binding BUT DOES NOT WORK TOTALLY LAST COLUMN MISSING
    this.dgCSVData.DataContext = oTable.DefaultView;
    this.dgCSVData.ItemsSource = oTable.DefaultView;
    tbLoadDgStat.Visibility = Visibility.Visible;

    //This does some error checking
    if (oTable.Rows.Count > 1)
    {
        if (msg.Trim().StartsWith("Warning"))
        {
            System.Windows.Media.Color c = Colors.Red;

            this.tbLoadDgStat.Background = new SolidColorBrush(c);
            System.Windows.Forms.MessageBox.Show(oTable.Rows.Count.ToString());
        }

        this.tbLoadDgStat.Text = msg;
        progressBar1.Value = 100;

        btUpload.IsEnabled = true;
    }
    else
    {
        this.tbdgImport.Text = "Error no data returned";
        progressBar1.Value = 50;
    }

    System.Windows.Forms.Cursor.Current = System.Windows.Forms.Cursors.Default;

    progressBar1.Visibility = Visibility.Hidden;
    this.Show();
}

我收到的错误是

System.Windows.Data 错误:40: BindingExpression 路径错误:在“对象”“DataRowView”(HashCode=30297615)上找不到“O”属性。绑定表达式 :Path=O/T 溢价; DataItem='DataRowView' (HashCode=30297615) ;目标元素是'TextBlock'(名称='') ;目标属性是“文本”(类型“字符串”)

路径 O/T Premium 是数据表和数据网格的最后一列。 它应该来自数据表中 O/T Premium Item: 7.92 值上方的行,这是一个小数,但正确绑定的前四个项目也是如此

我正在尝试使绑定​​尽可能通用,因为我希望在下一阶段的开发中将不同的 csv 文件读入数据网格

我不明白绑定问题,因为数据表中的所有其他项目都正确显示并由两行代码完成

 this.dgCSVData.DataContext = oTable.DefaultView;
        this.dgCSVData.ItemsSource = oTable.DefaultView;

【问题讨论】:

  • 你不能在你的Binding.Path 中使用/ 字符... 你可以看到错误说它找不到O 属性,因为/ 意味着什么在Binding 路径语法中。尝试重命名该列。
  • @Sheridan - 谢谢,一如既往,这是最简单的事情!数据表中的数据列发生了变化,没有问题
  • 很好,很高兴能帮上忙。我将把我的评论放入答案中,并请求您mark it as correct,以便其他用户知道这个问题已得到解答。
  • 也帮助了我!但我仍然想知道在这种情况下是否有办法使用/ 字符作为列标题的一部分。有点跑题了,但是如果标题中包含_ 字符,它将被删除。

标签: wpf data-binding binding datagrid datatable


【解决方案1】:

您不能在您的Binding.Path 中使用“/”字符...您可以看到错误表明它找不到O 属性,因为“/”意味着Binding 路径语法。从列中删除 '/' 字符将解决您的问题。

您可以从 MSDN 上的 Binding.Path Property 页面了解有关 Binding.Path 语法的更多信息。从链接页面:

当源是集合视图时,当前项可以用斜杠 (/) 指定。例如,子句 Path=/ 将绑定设置为视图中的当前项。当源是集合时,此语法指定默认集合视图的当前项。

【讨论】:

    【解决方案2】:

    请看上面@Sheridan 的评论

    我的问题是 / 是 wpf 绑定中的转义字符,请参阅微软文档here

    因此,当自动生成绑定路径时,我的数据表列在 sql 中为 [O/T Premium] 的数据列最终为 O,因此未映射。

    在我的表中更改我的sql数据列后没有问题。

    (我猜如果您不能更改数据表,您可以在 sql 命令中重命名问题列,例如 Select [O/T Premium] as [OT Premium]

    【讨论】:

    • 哎呀...我的意思是我会添加它作为答案,但无论如何谢谢...只是花了一些时间,因为我添加了更多内容以帮助未来的用户。