2

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

这就是我所拥有的。

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

我的xml是

<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”属性。BindingExpression :Path=O/T 溢价;DataItem='DataRowView' (HashCode=30297615) ; 目标元素是 'TextBlock' (Name='') ; 目标属性是“文本”(类型“字符串”)

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

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

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

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

2 回答 2

3

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

您可以从 MSDN 上的“属性”页面找到有关Binding.Path语法的更多信息。从链接页面:Binding.Path

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

于 2013-10-25T10:07:59.723 回答
0

请参阅上面来自@Sheridan 的评论

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

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

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

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

于 2013-10-25T10:07:26.777 回答