将 wpf c# 绑定到 datatable.defaultview 的数据网格:缺少最后一列数据,但标头在那里



我在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();
}

我收到的错误是

系统.视窗.数据错误: 40 : 绑定表达式路径错误: 在"对象"数据行视图"(哈希代码=30297615)"上找不到"O"属性。绑定表达式 :P ath=O/T 溢价;DataItem='DataRowView' (HashCode=30297615) ;目标元素是"文本块"(名称=") ;目标属性为"文本"(类型"字符串")

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

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

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

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

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

您可以从 MSDN 上的"Binding.Path属性"页找到有关Binding.Path语法的详细信息。从链接页面:

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

请参阅上面的评论 @Sheridan

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

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

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

(我想如果您无法更改数据表,则可以重命名sql命令中的问题列,例如将[O/T Premium]选择为[OT Premium]

最新更新