Gridview Visual FoxPro:删除网格中的行

Gridview Visual FoxPro:删除网格中的行,gridview,delete-row,foxpro,Gridview,Delete Row,Foxpro,我有一个网格有3列,第1列和第2列是文本框,第3列是按钮(用于删除) 我想要实现的是,当网格有记录时,我单击第3列中的按钮,该行将标记为已删除。不幸的是,它不适用于我,它只删除最后一行 这是我的表更新代码: SELE descCur2 thisform.item_grid.RecordSourceType = 4 thisform.item_grid.RecordSource = "select * from descCur2 into table descCur2a" GO top thisf

我有一个网格有3列,第1列和第2列是文本框,第3列是按钮(用于删除)

我想要实现的是,当网格有记录时,我单击第3列中的按钮,该行将标记为已删除。不幸的是,它不适用于我,它只删除最后一行

这是我的表更新代码:

SELE descCur2
thisform.item_grid.RecordSourceType = 4
thisform.item_grid.RecordSource = "select * from descCur2 into table descCur2a"
GO top
thisform.item_grid.Refresh
删除按钮内的一些代码:

this.setfocus
*thisform.item_grid.DeleteMark = .T.
Delete
thisform.item_grid.Refresh()
thisform.item_grid.SetFocus

你是说你已经搜索了几个小时,包括热门网站,但找不到答案。FWIW,VFP最受欢迎的网站是foxite.com和levelextreme.com。Levelextreme.com不支持AFAIK的互联网搜索,除了免费订阅外,还提供付费订阅选项。这两个网站都多次给出了这个问题的答案,因为我是在这两个网站上多次发布示例代码的人之一

您需要的是一个“DELETE”命令,xBase DELETE或SQL DELETE。ie:假设网格的记录源为“myCursor”:

select myCursor
* locate the row to delete - by default it is current row in grid
delete
或SQL删除:

*Get the ID of current row - assuming ID is the primary key field name
local id
id = myCursor.Id
Delete from myCursor where Id = m.Id
在这两种情况下,记录都将被标记为删除。如果:

Set deleted OFF
是当前设置(默认),则删除的记录将继续显示在网格中,并在“DeletedMark”上带有黑色标记

要让它消失,你需要两件事: 1) 应设置“设置已删除”设置。它的作用域为当前数据会话。因此,最好在DataEnvironment.BeforeOpenTables或Form.Load中设置它

Set deleted ON
2) 您应该选择网格的记录源,然后刷新

下面是一段经过测试的代码,演示了如何做到这一点:

Public oForm
oForm = Createobject('SampleForm')
oForm.Show()

Define Class sampleForm As Form
    Height=600
    Width=800
    Add Object myGrid As Grid With Height=600,Width=800, Anchor=15, RecordSource='myCursor'

    Procedure Init
        With This.myGrid
            .ColumnCount=3
            With .Columns(.ColumnCount)
                .Newobject('myButton','myButton')
                .CurrentControl = 'myButton'
                .MyButton.Visible = .T.
                .Sparse = .F.
            Endwith
        Endwith
    Endproc

    Procedure Load
        Local ix
        Create Cursor myCursor (Id Int, dummy c(10))
        For ix=1 To 100
            Insert Into myCursor (Id, dummy) Values (m.ix, Sys(2015))
        Endfor
        Locate
        Set Deleted On
    Endproc
Enddefine


Define Class MyButton As CommandButton
    Caption = "Delete Me"
    Procedure Click
        Select myCursor
        Delete
        With this.Parent.Parent
            .Refresh
        endwith
    Endproc
Enddefine
一些注意事项: 不要使用网格属性和方法,如针对此类情况使用RemoveObject。请记住,在大多数情况下,您对网格的记录源游标本身而不是网格对象执行操作。 DeleteMark虽然有时很有用(只是通过单击来删除一行),但并不重要。就我个人而言,我会在网格中删除它。DeleteMark=.f..T。只需设置该特殊列的可见性

同样,不要在这样的操作上使用RemoveObject。实际上,Thisform.Grid.RemoveObject(Thisform.Grid.ActiveRow)是一个无意义的命令。ActiveRow将返回一个整数(如果有ActiveRow),removeObject需要一个对象“name”作为字符串。假设你拥有它,它会真正移除什么?网格只是记录源顶部的一个可视化布局,您可能会从可视化布局中删除一些内容(如底层数据的视图窗口)

追加空白,替换在这种情况下对我来说是完全不清楚的。实际上,在现实生活中,我会在“永不使用命令”中列出“Append blank\Replace”。这是古代Foxpro 2.x时代的东西(20多年过去了)。它在多用户场景中容易出错,很难展示,但最终可能会在不同的行上进行替换。简单而安全的替代方法是执行SQL插入。即:

而不是这样做:(假设当前别名是myCursor)

这样做:

insert into myCursor (name, surname) values ('Cetin', 'Basoz')
尽管xBase版本(append\replace),但此SQL版本是一个单一命令和原子(以及更可读的IMHO)


HTH

网格绑定到什么-直接绑定到要删除其中记录的表或光标?
insert into myCursor (name, surname) values ('Cetin', 'Basoz')