【发布时间】: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>
- 我正在将一个 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