Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.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
Vb.net Linq DataContext仍然检索;删除“;对象_Vb.net_Linq_Linq To Sql_Datacontext - Fatal编程技术网

Vb.net Linq DataContext仍然检索;删除“;对象

Vb.net Linq DataContext仍然检索;删除“;对象,vb.net,linq,linq-to-sql,datacontext,Vb.net,Linq,Linq To Sql,Datacontext,我正在使用绑定到Linq数据“对象列表”的网格 网格以“断开连接的方式”运行,这意味着当我编辑或抑制一行时,更改不会立即提交到数据库。在对调用DataContext.SubmitChanges方法进行所有更改后,将单击一个单独的“保存”按钮 问题是,当我删除网格中的一行时,deleteonsubmit方法被很好地调用,但是当我刚刚重新绑定网格时,该行仍然在这里 我需要一种类似Datatables的行为,当datatable绑定到网格时,处于已删除状态的行不会显示。这可能吗 补遗 代码不多,因为G

我正在使用绑定到Linq数据“对象列表”的网格

网格以“断开连接的方式”运行,这意味着当我编辑或抑制一行时,更改不会立即提交到数据库。在对调用DataContext.SubmitChanges方法进行所有更改后,将单击一个单独的“保存”按钮

问题是,当我删除网格中的一行时,deleteonsubmit方法被很好地调用,但是当我刚刚重新绑定网格时,该行仍然在这里

我需要一种类似Datatables的行为,当datatable绑定到网格时,处于已删除状态的行不会显示。这可能吗

补遗 代码不多,因为GridView使用它的自动行为(AutoGenerateColumns、AutoGenerateEditButton等)

下面是我用来删除对象的代码

<DataObjectMethod(DataObjectMethodType.Delete)> _
Public Sub Supprimer(ByVal code As Integer)
    Dim ctx = getDataContext()

    Dim leGerant = (From g In ctx.Gerant Where g.CODE = code).FirstOrDefault
    ctx.Gerant.DeleteOnSubmit(leGerant)

    End Sub
_
公共子供应商(字节码为整数)
Dim ctx=getDataContext()
Dim leGerant=(从ctx.Gerant中的g开始,其中g.CODE=CODE)。FirstOrDefault
ctx.Gerant.deleteosubmit(leGerant)
端接头
下面是我用来选择对象的代码

    <DataObjectMethod(DataObjectMethodType.Select)> _
    Public Function Selectionner()
        Dim ctx = getDataContext()

        Return From g In ctx.Gerant
    End Function
_
公共函数Selectionner()
Dim ctx=getDataContext()
从g返回ctx.Gerant
端函数
@马格纳斯

你不明白我的问题。当单击save按钮时,我会调用SubmitChanges,并且更改效果良好。问题不在这里


问题是,当我删除网格中的一行时,deleteonsubmit方法被很好地调用,但是当我刚刚重新绑定网格时,该行仍然在这里!通常,删除的对象不应在GridView中显示为一行,即使我尚未将更改提交到数据库。

DeleteOnSubmit
不会“删除”该项。它将其标记为在下次提交时删除

您需要添加提交行,使其成为:

Dim ctx = getDataContext()
Dim leGerant = (From g In ctx.Gerant Where g.CODE = code).FirstOrDefault    
ctx.Gerant.DeleteOnSubmit(leGerant)
ctx.SubmitChanges()
编辑:假设ctx在两个调用中都是相同的实例,您可以尝试

<DataObjectMethod(DataObjectMethodType.Select)> _
Public Function Selectionner()
    Dim ctx = getDataContext()

    Dim deleted = ctx.ObjectStateManager
        .GetObjectStateEntries(System.Data.EntityState.Deleted).OfType<Gerant>();

    Return (From g In ctx.Gerant).Except(deleted);
End Function
_
公共函数Selectionner()
Dim ctx=getDataContext()
Dim deleted=ctx.ObjectStateManager
.GetObjectStateEntries(System.Data.EntityState.Deleted).OfType();
申报表(从ctx.Gerant中的g处)。除(已删除)外;
端函数

这是未经测试的,所以我不确定它是否会工作,但它似乎可以编译。

这取决于您的代码。。。您尚未向我们展示的内容…发布一些代码,以便它可以清除您的查询。您必须调用
ctx.SubmitChanges()
才能使更改生效。好的,您的意思是标记为删除的对象始终会被检索,直到我将更改提交到数据库?!如果是,我的一个解决方案是在内存中保留已删除对象的代码列表,并将其从select请求中排除。@Kernel999我的意思是,在调用
SubmitChanges
之前,这些值仍在数据库中。因此,您在ctx.Gerant中调用
Return From g将继续检索它们。@Kernel999添加了一个可能的解决方法,即如果ctx是同一个实例,那么ctx就是同一个实例,据我所知,如果我在同一数据上下文中多次执行“Return From g In ctx.Gerant”,它将只在第一次访问数据库,其他时候使用第一次请求返回的相同数据。