Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
WPF DataGrid/LINQ查询(DataGrid新行不可见)_Wpf_Vb.net_Linq - Fatal编程技术网

WPF DataGrid/LINQ查询(DataGrid新行不可见)

WPF DataGrid/LINQ查询(DataGrid新行不可见),wpf,vb.net,linq,Wpf,Vb.net,Linq,我对WPF/LINQ2Entities比较陌生。我设法取得了进展,但我一直在研究一个问题: 1) 我有一个基于此CollectionViewSource填充的WPF数据网格。CollectionViewSource的源是一个LINQ查询 Private context As New QADBEntities Dim QADBEntitiesViewSource As CollectionViewSource Dim SalesOrderSerialNum

我对WPF/LINQ2Entities比较陌生。我设法取得了进展,但我一直在研究一个问题:

1) 我有一个基于此CollectionViewSource填充的WPF数据网格。CollectionViewSource的源是一个LINQ查询

    Private context As New QADBEntities        
    Dim QADBEntitiesViewSource As CollectionViewSource

    Dim SalesOrderSerialNumber_Query = From salesOrders In context.tblSalesOrders
                           Join serialNumbers In context.tblSerialNumbers
                           On salesOrders.Sales_Order_ID Equals serialNumbers.Sales_Order_ID
                           Where salesOrders.Sales_Order_ID = 5
                           Select New With {salesOrders, serialNumbers}


    QADBEntitiesViewSource = CType(Me.FindResource("QADBEntitiesViewSource"), CollectionViewSource)
    QADBEntitiesViewSource.Source = SalesOrderSerialNumber_Query.ToList()
以下是DataGrid的XAML摘录:

            <DataGrid x:Name="TblSerialNumbersDataGrid" AutoGenerateColumns="False" EnableRowVirtualization="True" CanUserAddRows="True"
              ItemsSource="{Binding Source={StaticResource QADBEntitiesViewSource}}" Margin="293,44,10,16" 
              RowDetailsVisibilityMode="VisibleWhenSelected" Grid.ColumnSpan="2">
              <DataGrid.Columns>
                  <DataGridTextColumn x:Name="Kit_Group_IDColumn" Binding="{Binding serialNumbers.Kit_Group_ID}" Header="Kit Group ID" Width="SizeToHeader"/>
                  <DataGridTextColumn x:Name="NotesColumn" Binding="{Binding serialNumbers.Notes}" Header="Notes" Width="SizeToHeader"/>
                  <DataGridTextColumn x:Name="Product_IDColumn" Binding="{Binding serialNumbers.Product_ID}" Header="Product ID" Width="SizeToHeader"/>
                  <DataGridTextColumn x:Name="Production_Lead_IDColumn" Binding="{Binding serialNumbers.Production_Lead_ID}" Header="Production Lead ID" Width="SizeToHeader"/>
                  <DataGridTextColumn x:Name="QA_Personnel_IDColumn" Binding="{Binding serialNumbers.QA_Personnel_ID}" Header="QA Personnel ID" Width="SizeToHeader"/>
                  <DataGridTextColumn x:Name="Sales_Order_IDColumn" Binding="{Binding serialNumbers.Sales_Order_ID}" Header="Sales Order ID" Width="SizeToHeader"/>
                ....etc
              </DataGrid.Columns>
    </DataGrid>

……所有的东西,包括新的一排,都是功能性的。任何帮助或指点都将不胜感激。再一次,我对这个很陌生,我意识到这可能是我整个设计的一个问题。谢谢。

Linq查询结果是只读的,如果您希望能够向数据源添加项,您可能需要提供自己的类作为
,该类枚举您的结果(
IEnumerable
),并提供操作数据源的方法(
IList
)。

实际上,这里的问题不在于LINQtoEntities,也不在于网格,而在于EF。EF支持对集合中的对象进行更改,甚至支持在向表中添加行(即向ObjectSet添加项)时发出更改通知,但不支持通过CollectionViewSource自动添加行。如果需要,可以返回到数据集,或者只创建一个“addnew”命令,将新项添加到ObjectSet并使其成为CollectionViewSource的当前项

您可以通过调用CollectionViewSource.View.refresh刷新CollectionViewSource,也可以通过调用CollectionViewSource.View.MoveCurrentTo(newItem)将特定项设置为当前项。但是,对于对象查询,可能需要再次运行查询,即重复CollectionViewSource.Source=


我发现EF对集合视图源的支持不稳定;这在很大程度上取决于您如何准确地获得您的实体列表—支持什么和不支持什么。第一个代码返回一个ObjectQuery,必须再次执行它才能识别对基础列表的更改,而第二个示例返回一个ObjectSet,据我所知,它支持添加和删除项以及集合更改通知。因此,事实上,我应该在第一段中说,EF仅在某些情况下支持通过CollectionViewSource添加行…

只是一个猜测:可能问题是,
CollectionViewSource
是只读的。作为一个快速测试,我会尝试使用
可观测集合
或与源类似的集合。H.B.——非常感谢。我不知道关于Linq查询结果的情况。因此,即使linq查询结果是只读的,也可以保存对数据的更改(我可以这么做)?@K.Akins:集合本身与其项不同,任何可变的对象即使是不可变集合的一部分(如linq查询返回的
IEnumerables
),也仍然是可变的.我知道你所说的添加新命令是什么意思,它运行得很好。现在,我只需要了解如何刷新表,或者按照您所说的“使其成为CollectionViewSource的当前项”。我真的不想去数据集,因为我认为LINQtoEntities是一条路要走。谢谢你的帮助。但我仍然不明白为什么在另一个DataGrid(见最后一段代码)上,我能够使用EF和数据绑定通过新行添加新记录。我是不是误解了?hbarck——这回答了我的大部分问题。非常感谢您的帮助。此外,如果您有时间,这只是一个需要回答的外围问题:您对使用数据网格和LINQtoEntities查询进行数据操作的最佳/高效途径有何建议?我意识到实现这一点的方法不止一种,但有没有一种大多数人似乎觉得有效的标准做法?我发现使用CollectionViewSource是可行的,但我不知道从长远来看,使用多个表/联接查询是否是最好的。对不起,我不知道最好的方法是什么。。。到目前为止(.net 4.0),我既不喜欢EF也不喜欢DataGrid。。。
            QADBEntitiesViewSource = CType(Me.FindResource("QADBEntitiesViewSource"), CollectionViewSource)
            QADBEntitiesViewSource.Source = context.SalesOrderListSQ.ToList()