急救!dbgrid中关于dataset的删除操作!(120分)

  • 主题发起人 主题发起人 windflower
  • 开始时间 开始时间
同意,左轻侯DBGrid中选中的记录是一组BookMark根据它可对象医德记录操作
 
to windflower:在Object Inspector里看看你的DBGrid.Options是不是这样设的?
(我是直接放一个DBGrid然后把Options调整到可以多选和不出现英文提示的,其它的没动)
[dgEditing,dgTitles,dgIndicator,dgColumnResize,dgColLines,dgRowLines,dgTabs,dgCancelOnExit,dgMultiSelect]
至于删除确认,我就是象前面所说的在DBGrid的OnKeyDown里截获Del按键处理的。
(注意只是按一个Del键实现删除,我觉得比按Ctrl+Del更容易让用户接受,你说呢?:)
至于按Ctrl的同时结合鼠标进行多选(不是连选,只能一行一行地点选)不成功的现象我倒没碰到过,不明白。

另,to 左轻侯:>>应该直接在query里进行删除例如捕获keydown事件,找到所选记录的ID
记录的ID怎么找?可能会比较麻烦。而且帮助里对TBookmarkList.Delete的说明是这样的:
Deletes all the records specified by the bookmarks in the list from the dataset of the associated DBGrid.
我觉得TBookmarkList的Delete就可以了,VCL可以很准确地实现实际的记录删除,何必自己实现呢?
呵呵,如果说得不对,请左大侠包涵并指教:)
 
不敢当:-)
你误解了,我说的记录ID,不是指它在物理上的ID
而是指在表中唯一确定某条记录的那个字段(比如access中的自增量字段)
在dbgrid中找出所有选中row的相应字段的值,将它们传送给dataset,
以此为依据,在dataset中将之删除
当然也可以象yubo兄说的,用BookMark为依据把它们删掉
只是我说的这种方法可以不依赖于dbgird,而使用Bookmark比较方便
但是象
DBGrid1.SelectedRows.Delete
这样的方法我认为是不可取的
因为数据操作代码与用户界面应该分离开来,对于数据库的显式访问
应该被封装在datamodule中
这样不但结构清晰,维护方便,而且能够简单地在
单层、双层、三层、B/S等方式之间进行转换
 
to 左轻侯:
如果用数据集控件的BookMark,那如何对选中的多条记录进行定位呢?
BookMark属性本身应该是只能记录一条记录(当前记录)的指针,多条记录的选定在数据集控件里又是怎么反映的呢?
我看了一下源码,没找到答案:(
似乎一个BookMark的状态(TBookmarkFlag)只有四种:(bfCurrent, bfBOF, bfEOF, bfInserted),看不出有代表选中的状态。
而且实在是不明白源码里为什么要用一个String类型的变量(TDataSet.Bookmark)去实现Pointer的功能!

to yubo:
>>DBGrid中选中的记录是一组BookMark
这个“一组”是什么意思?是存在于数据集控件里,还是记录在DBGrid控件里?
 
我这的是TDBGrid.SelectedRows属性
它是TBookmarkList类型
var
iCount: integer;
begin
for iCount := 0 to DBGrid1.SelectedRows.Count - 1 do
begin
Table1.GotoBookmark(DBGrid1.SelectedRows.Items);
.....
end;
end;
别忘了保存恢复原有位置
 
谢谢大家!
 
多人接受答案了。
 
后退
顶部