Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/336.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
C# 延迟评估和DataGrid.ItemsSource出现问题_C#_Wpf_Linq To Sql_Datagrid - Fatal编程技术网

C# 延迟评估和DataGrid.ItemsSource出现问题

C# 延迟评估和DataGrid.ItemsSource出现问题,c#,wpf,linq-to-sql,datagrid,C#,Wpf,Linq To Sql,Datagrid,我在将DataGrid的ItemsSource属性设置为LINQ查询的结果时遇到问题。确切的错误是: 无法访问已释放的对象。 对象名称:“在Dispose之后访问的DataContext.” 现在,在您开始窃笑并快速给出关于延迟查询评估和处理数据库上下文的答案之前,请知道我确实理解所有这些。我正在对查询结果调用ToList(),并将其分配给ItemsSource属性。所以,执行查询,将结果读入内存,应该是可以的 是的,没那么多。起初,我认为一定是属性本身导致了这种情况,例如,一些我不知道的奇怪的

我在将DataGrid的ItemsSource属性设置为LINQ查询的结果时遇到问题。确切的错误是:

无法访问已释放的对象。 对象名称:“在Dispose之后访问的DataContext.”

现在,在您开始窃笑并快速给出关于延迟查询评估和处理数据库上下文的答案之前,请知道我确实理解所有这些。我正在对查询结果调用ToList(),并将其分配给ItemsSource属性。所以,执行查询,将结果读入内存,应该是可以的

是的,没那么多。起初,我认为一定是属性本身导致了这种情况,例如,一些我不知道的奇怪的数据绑定事情(目前正在学习WPF和linq2Sql)。在仔细考虑之后,我仍然无法解释这个问题,因为DataGrid不应该有任何DataContext的概念,只是列表(尽管从测试方法返回一个列表并在稍后对其进行迭代不会引发异常)

它是在数据上下文被销毁后被访问的,但这也不能帮助我理解,因为我调用ToList()是为了在using块退出之前执行查询。但是,我可以解决问题,如下所示:

private void button1_Click( object sender, RoutedEventArgs e )
{
    using( NorthwindDataContext db = new NorthwindDataContext() )
    {
        db.DeferredLoadingEnabled = false;  // works, but why is it necessary at all?
        grid.ItemsSource = (from o in db.Orders
                            where o.CustomerID == "VINET"
                            select o).ToList();
    }
}
所以,是的,我想在走得太远之前了解一下这种行为。提前谢谢

编辑:主窗口和DataGrid的xaml

<Window x:Class="WpfApplication1.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="495" Width="722">
    <Grid>
        <DataGrid AutoGenerateColumns="true" Height="403" HorizontalAlignment="Left" Margin="12,41,0,0" Name="grid" VerticalAlignment="Top" Width="676" />
        <Button Content="Do it" Height="23" HorizontalAlignment="Left" Margin="12,12,0,0" Name="button1" VerticalAlignment="Top" Width="75" Click="button1_Click" />
    </Grid>
</Window>


您的代码表明将DelferredLoadingEnabled设置为false修复了此问题?如果是这样的话,我会假设您的数据绑定正在访问相关对象的属性,当被访问时,该对象正试图触发一个新的查询来检索所述对象。

当数据绑定访问相关对象上的属性时(如引用了order对象的order对象),延迟加载正在启动,一个新的查询正在启动,请为您的数据网格发布XAML-希望这将使发现问题变得容易好了,XAML启动了。谢谢你,因为你指引我找到了我唯一改变的东西;AutoGenerateColumns属性。将其设置为false就成功了。显然,这意味着我必须手动创建所有列并设置它们的绑定,除非我想在DataGrid的生命周期中保留上下文。这很不幸,也许我能找到更好的方法。你几乎总是想手动创建所有列,否则所有的主键、外键等最终都会显示在网格中。我不认为我曾经绑定到一个网格,在那里我可以自动生成所有列。