在DataGraid中删除数据出错?

woolnil 2008-04-15 11:07:47
Q:在DataGrid表格中单击左边的选择器选中整行时,可正常删除当前行数据;但焦点在其中一个单元格时删除当前行数据则提示:
Microsoft DataGrid 控件
行句柄引用了一个已被删除的行或被标识为删除的行.

错误对象内没有任何错误.

相关代码如下:

Dim rsSub As New ADODB.Recordset
strSQL = "Select 主表标识,商品编号,商品名称,规格型号,商品品牌,单位,数量,单价,金额,折后金额,备注 From OutStoreSub Where 有效值=1"
rsSub.CursorLocation = adUseClient
rsSub.Open strSQL, gcnnConnect, adOpenStatic, adLockBatchOptimistic

If MsgBox("是否确定删除当前记录?", vbYesNo + vbInformation) = vbYes Then
rsSub.Delete
rsSub.UpdateBatch
End If

执行到"rsSub.Delete"时出现如上错误信息,怎么才能够正常删除呢?
...全文
155 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
woolnil 2008-04-17
  • 打赏
  • 举报
回复
我是所有用到datagrid表格的页面都出现这个问题,我把品牌管理的代码帖出来:

Option Explicit

Dim rsBrand As New ADODB.Recordset
Dim rsBrandKind As New ADODB.Recordset

Private Sub Form_Load()

Dim strBrand As String

strBrand = "Select * From DictMain Where 类型编号='002'" '从字典主表筛选品牌类型
Set rsBrandKind = OpenRecordset(strBrand, adOpenStatic, adLockReadOnly)
strBrand = "Select 类型编号,类型名称,编号 AS 品牌编号,名称 AS 商品品牌 From DictSub Where 类型编号='002' Order by 自动编号"
rsBrand.CursorLocation = adUseClient
Set rsBrand = OpenRecordset(strBrand, adOpenStatic, adLockBatchOptimistic) '品牌信息

'设置品牌表格样式
With grdBrand
Set .DataSource = rsBrand
.Columns(0).Visible = False
.Columns(1).Visible = False
.Columns(2).Width = 1500
.Columns(3).Width = 2000
End With

Width = 6960
Height = 5550

End Sub

Private Sub Form_Unload(Cancel As Integer)

Dim rsTemp As Recordset

Set rsTemp = rsBrand.Clone
rsTemp.Filter = 1
If Not (rsTemp.EOF And rsTemp.BOF) Then '判断是否有未保存数据
If MsgBox("是否保存已修改的数据?", vbYesNo + vbInformation, STR_MSGTITLE_HINT) = vbYes Then
rsBrand.UpdateBatch
Else
rsBrand.CancelBatch
End If
End If

Set rsTemp = Nothing
Set rsBrand = Nothing
Set grdBrand.DataSource = Nothing
Set rsBrandKind = Nothing
Call DelWinMenu("frmBrand")

End Sub

'按回车实现TAB键功能
Private Sub grdBrand_KeyPress(KeyAscii As Integer)

With grdBrand
If KeyAscii = 13 Then
If .Col = .Columns.Count - 1 Then
If .Row < rsBrand.RecordCount - 1 Then '移到下一行
.Row = .Row + 1
.Col = 0
SendKeys "{TAB}"
SendKeys "+{TAB}"
Exit Sub
Else '若是最后一行,则添加新记录
rsBrand.AddNew
Call grdBrand_OnAddNew
.Col = 0
SendKeys "{TAB}"
SendKeys "+{TAB}"
Exit Sub
End If
End If
SendKeys "{TAB}"
End If
End With

End Sub

'写入字典类型名称及编号
Private Sub grdBrand_OnAddNew()

rsBrand.Fields(0).Value = rsBrandKind.Fields("类型编号").Value
rsBrand.Fields(1).Value = rsBrandKind.Fields("类型名称").Value

End Sub

Private Sub tlbBrand_ButtonClick(ByVal Button As MSComctlLib.Button)

With rsBrand
Select Case Button.Key
Case "tlbNew" '新增
.AddNew
.Fields(0).Value = rsBrandKind.Fields("类型编号").Value
.Fields(1).Value = rsBrandKind.Fields("类型名称").Value
grdBrand.SetFocus
grdBrand.Col = 2
Case "tlbCancle" '取消
.CancelBatch
Case "tlbDelete" '删除
If MsgBox("是否确定删除当前记录?", vbYesNo + vbInformation, STR_MSGTITLE_HINT) = vbYes Then
.Delete
Me.SetFocus
.UpdateBatch
grdBrand.SetFocus
End If
Case "tlbSave" '保存
Me.SetFocus
.UpdateBatch
grdBrand.SetFocus
Case "tlbFirst" '首记录
.MoveFirst
Case "tlbPrevious" '上记录
If Not .BOF Then .MovePrevious
If .BOF Then .MoveFirst
Case "tlbNext" '下记录
If Not .EOF Then .MoveNext
If .EOF Then .MoveLast
Case "tlbLast" '末记录
.MoveLast
Case "tlbExit" '退出
Unload Me
End Select
End With

End Sub
温飞_会员 2008-04-17
  • 打赏
  • 举报
回复
你的 rsSub.Open strSQL, gcnnConnect, adOpenStatic, adLockBatchOptimistic 中的 adOpenStatic 改为
AdOpenDynamic
就OK了
dbcontrols 2008-04-17
  • 打赏
  • 举报
回复
他以为你用一堆按钮,我一般用Select Case Button.index
[Quote=引用 12 楼 woolnil 的回复:]
我用的是ToolBar控件,不用这种Select Case Button.Key ,用什么比较好?
至于With...End With我个人觉得这样写比较方便,阅读起来还好吧.
[/Quote]
woolnil 2008-04-17
  • 打赏
  • 举报
回复
我用的是ToolBar控件,不用这种Select Case Button.Key ,用什么比较好?
至于With...End With我个人觉得这样写比较方便,阅读起来还好吧.
cbm6666 2008-04-17
  • 打赏
  • 举报
回复
试着帮你改了代码, 实在改不下去了, 我投降

你的问题不在于能不能删除, 删除的动作没啥大不了, 你好好检查这个SUB, 你的 Select Case 确实无法领教

Private Sub tlbBrand_ButtonClick(ByVal Button As MSComctlLib.Button)
With rsBrand
Select Case Button.Key

上面这些无法理解你的思路..............

建议你善用数组控件, 一堆Command你不用数组,代码写起来多烦杂.

With...End With 倒是开眼界,还没见过你这种写法.
cbm6666 2008-04-16
  • 打赏
  • 举报
回复
点击表格中的某一个单元格来删除这笔也不会有问题, 问题在于你为何不贴出你的点击代码是如何写的????
woolnil 2008-04-16
  • 打赏
  • 举报
回复
好像我的意思'cbm666'你还没理解,datagrid绑定记录集,现在窗体的焦点在datagrid表格中的一个单元格内,这个时候我单击删除,执行我帖上去的代码时出错.你上面的代码这样执行是不会有问题的.
cbm6666 2008-04-16
  • 打赏
  • 举报
回复
'下面这个代码我用我的库.mdb完全测试过了,再不行就是你的问题了.
'注意:这个代码是只要 有效值=1 的所有记录全部干掉, 否则的话你把下面的DO...Loop改一下.

Public gcnnConnect As New ADODB.Connection
Public rsSub As New ADODB.Recordset
Dim db$, Appdisk$, strSQL$
Private Sub Form_Load()
Appdisk = Trim(App.Path)
If Right(Appdisk, 1) <> "\" Then Appdisk = Appdisk & "\"
db = "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" & Appdisk & "bwscale.mdb" '.mdb改为你自己的库名
gcnnConnect.CursorLocation = adUseClient
gcnnConnect.Open db
strSQL = "Select 主表标识,商品编号,商品名称,规格型号,商品品牌,单位,数量,单价,金额,折后金额,备注 From OutStoreSub Where 有效值=1"
rsSub.Open strSQL, gcnnConnect, adOpenKeyset, adLockPessimistic
'Set DataGrid1.DataSource = rsSub
If rsSub.recordcount > 0 Then
rsSub.MoveFirst
If MsgBox("是否确定删除当前记录?", vbYesNo + vbInformation) = vbYes Then
Do
rsSub.Delete
If Not rsSub.EOF Then rsSub.MoveNext
Loop Until rsSub.EOF
End If
End If
'Set DataGrid1.DataSource = Nothing
'Set DataGrid1.DataSource = rsSub
End Sub
woolnil 2008-04-16
  • 打赏
  • 举报
回复
我的有效值是数值型的.
cbm6666 2008-04-15
  • 打赏
  • 举报
回复
strSQL = "Select 主表标识,商品编号,商品名称,规格型号,商品品牌,单位,数量,单价,金额,折后金额,备注 From OutStoreSub Where 有效值=" & chr(39) & "1" & chr(39)

最好在delete前面加个判断,你是因为没找到数据所以才会错

if not rsSub.eof then......



woolnil 2008-04-15
  • 打赏
  • 举报
回复
在DataGrid表格中单击左边的选择器选中整行时,可正常删除当前行数据;但焦点在其中一个单元格时删除当前行数据则提示:
Microsoft DataGrid 控件
行句柄引用了一个已被删除的行或被标识为删除的行.

错误对象内没有任何错误.

我只要删除当前行.
dbcontrols 2008-04-15
  • 打赏
  • 举报
回复
gcnnConnect.Excute "Delect * From OutStoreSub Where 有效值=1"
也出错么?
woolnil 2008-04-15
  • 打赏
  • 举报
回复
用adOpenKeyset出现同样错误
dbcontrols 2008-04-15
  • 打赏
  • 举报
回复
是不是adOpenStatic出了问题?

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧