怎样程序实现在delphi dbgrid 多选中用shift多选??

Delphi&关于DBGrid多选删除(shitf多选,ctrl多选)
杭州翻译公司& 杭州翻译
杭州教务软件 在线学习 在线考试
////删除多选记录
procedure THistoryForm.DeleteButtonClick(Sender: TObject);
& tempBookMark:TbookM
& if dbgrid1.SelectedRows.Count &=
MessageBox(Handle,'请选择您要删除的记录','提示',MB_OK);
MessageBox(Handle,'删除后数据将不可恢复,您确定要删除吗?','提示',mb_iconinformation+mb_YesNo)=IdYes
DBGrid1.Datasource.Dataset.DisableC
i&=dbgrid1.SelectedRows.Count - 1 Do
DBGrid1.Datasource.Dataset.Bookmark:=dbgrid1.SelectedRows.Items[i];//重要的在这里,取得BOOKMARK
TempBookmark:=DBGrid1.Datasource.Dataset.GetB
DBGrid1.Datasource.Dataset.GotoBookmark(TempBookmark);
with ADOQuery3 do
SQL.Add('delete from his where id=:a');
Parameters.ParamByName('a').Value:=Dbgrid1.DataSource.DataSet.fieldbyname('id').AsI
DBGrid1.Datasource.Dataset.FreeBookmark(TempBookmark);&&&&
//释放BOOKMARK
inc(i);&& //下一个选择记录
DBGrid1.Datasource.Dataset.EnableC
Act_ShowCTInfo(LBName.Caption);
//定义全局变量
& blSelect: B
& BookMark: TBookM
& CurrNo, OldNo:
/////////按Shift多选
procedure THistoryForm.DBGrid1MouseUp(Sender: TO
& Button: TMouseB Shift: TShiftS X, Y:
begin //实现 Shift+鼠标左键单击 多选
& if Button = mbLeft then
&&& if not
blSelect then
BookMark := ADOQuery1.GetBookM
OldNo := ADOQuery1.RecNo;
blSelect := T
if ssShift in Shift then
CurrNo := ADOQuery1.RecNo;
ADOQuery1.DisableC
ADOQuery1.GotoBookmark(BookMark);
DBGrid1.SelectedRows.CurrentRowSelected := T
if CurrNo & OldNo then
while CurrNo & ADOQuery1.RecNo do
&&&&&&&&&&&
DBGrid1.SelectedRows.CurrentRowSelected := T
&&&&&&&&&&&
ADOQuery1.N
while CurrNo & ADOQuery1.RecNo do
&&&&&&&&&&&
DBGrid1.SelectedRows.CurrentRowSelected := T
&&&&&&&&&&&
ADOQuery1.P
ADOQuery1.EnableC
ADOQuery1.FreeBookmark(BookMark);
blSelect := F
CurrNo := 0;
OldNo := 0;
BookMark := ADOQuery1.GetBookM
OldNo := ADOQuery1.RecNo;
blSelect := T
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。DBGRID怎么实现分块多选啊?
Description of your first forum.
15 篇帖子 & 分页:1 / 2
由 吴剑明 & 星期一, 日 13:05
按鼠标倒可以实现,但按键盘就不行了。:(
如,有1--5条记录,要选中1、2、4。
要自己重新开发多选功能。我现在已经能够画出多选的画面了,但是如何把选中的记录
放到TBOOKMARKLIST 里去呢?请教
由 千中元 & 星期一, 日 13:22
由 JohnsonGuo & 星期一, 日 13:33
由 xixi12359 & 星期一, 日 13:57
由 吴剑明 & 星期一, 日 19:03
由 dq & 星期一, 日 22:18
我觉得应该用DBGrid.SelectedRows.CurrentRowSelected。
比如用空格键模拟鼠标点击,在DBGrid的OnKeyDown里:
&if (Key = VK_SPACE) and (DBGrid1.DataSource.DataSet.State = dsBrowse) then begin
& &DBGrid1.SelectedRows.CurrentRowSelected :=
& & ¬ DBGrid1.SelectedRows.CurrentRowS
& &Key := 0;
但这样有一个问题:如果DBGrid的Options里包含gdRowSelect或gdMultiSelect,
那么当按键使活动记录发生转移时(即按了上下键或翻页键),
DBGrid的SelectedRows会被清掉,所以必须参照一下源码把这些键也截下来自己处理。
如果不包括,则虽然可以保持住SelectedRows,但界面上是否选中的提示就没有了。
不过你说你“已经能够画出多选的画面了”,我想做出一个提示应该不难吧。
由 吴剑明 & 星期二, 日 12:47
我想用代码把我已画好的记录,填加到那个Tbookmarklist里
由 dq & 星期二, 日 14:05
用一个循环就行啊。
你肯定已经记下了选中记录的位置,在一个循环中依次把当前记录定位到各个选中的记录上,
然后来一句DBGrid1.SelectedRows.CurrentRowSelected := T就可以了。
由 吴剑明 & 星期二, 日 19:04
我就是想知道如何把选中的记录,用自己写程序的方式,写到TBOOKMARKLIST里呀
由 dq & 星期二, 日 19:46
呵呵,那就得看你是怎么保存选中的记录的啦。
如果你的保存方式不太适合定位的话,那就用GetBookMark结合TList选一个记一个,
因为GetBookMark得到的是一个指针,所以可以很方便地用一个全局的TList来保存这些指针,
然后用TList可以遍历所有的BookMark,再用GotoBookMark也可以实现定位。
再不然自定义一个结构,TList用来保存一个该结构的指针数组,而结构里包含BookMark,
这样还可以记录较多的信息。所以不一定非要用TBookMarkList的。
由 温柔一刀 & 星期四, 日 17:24
先画出来再加进去,有点本末倒置吧?
最简单的办法是:把dbgrids.pas存到本地目录,自己修改相关部分,就一切OK了。
不要说我这是歪招:
首先,如果delphi新版本出来了,你现在的方法也未必就能用;
其次,我说的修改非常容易,就一条语句,即使新版的delphi出来了,
找到相应地方再修改一下,仍然很容易,比你现在这样劳神费力应该还是好的多的。
由 吴剑明 & 星期一, 日 19:10
温老大怎么不说详细点?
由 Crab & 星期一, 日 19:41
由 温柔一刀 & 星期一, 日 20:01
呵呵,不是不说详细,而是等你的回应,如果你根本不考虑这种方法,我说详细干什么呢?
在dbgrids.pas中找到:
&procedure ClearS
& &if (dgMultiSelect in Options) then
// & & &FBookmarks.C
& & &FSelecting := F
象上面这样把那句话注释掉,这时候用键盘(shift+箭头)选中的行已经不会
因为纪录的移动而被清除选择了,革命已经成功了99%。
剩下的就是自己程序的事情,比如在dbgrid的onkeypress中:
procedure TForm1.DBGrid1KeyPress(Sender: TO var Key: Char);
& if key=#32 then
& & &with dbgrid1.SelectedRows do
& & & &CurrentRowSelected:=not CurrentRowS
就可以实现空格键选中/取消选中,等等...
而且这样不影响其他功能,只要用鼠标移动,一切又都还原了。
由 吴剑明 & 星期三, 日 12:47
多人接受***了。
15 篇帖子 & 分页:1 / 22532人阅读
Delphi应用(13)
在实际项目中,偶然遇到需要按下SHIFT键,在DBGrid中进行多选的情况,测试了几种方法,最终确定了一个比较好的解决方法,总结如下:
procedure TTestFrame.TestDBGridMouseUp(Sender: TO Button: TMouseB
Shift: TShiftS X, Y: Integer);
begin //实现 Shift+鼠标左键单击 多选
if Button = mbLeft then
if not FblSelect then
FBookMark :=
TDBGrid(Sender).DataSource.DataSet.GetBookM
TDBGrid(Sender).DataSource.DataSet.RecNo;
FblSelect := T
if ssShift in Shift then
FCurrNo :=
TDBGrid(Sender).DataSource.DataSet.RecNo;
TDBGrid(Sender).DataSource.DataSet.DisableC
TDBGrid(Sender).DataSource.DataSet.GotoBookmark(FBookMark);
TDBGrid(Sender).SelectedRows.CurrentRowSelected := T
if FCurrNo & FOldNo then
while FCurrNo &
TDBGrid(Sender).DataSource.DataSet.RecNo do
TDBGrid(Sender).SelectedRows.CurrentRowSelected := T
TDBGrid(Sender).DataSource.DataSet.N
while FCurrNo &
TDBGrid(Sender).DataSource.DataSet.RecNo do
TDBGrid(Sender).SelectedRows.CurrentRowSelected := T
TDBGrid(Sender).DataSource.DataSet.P
TDBGrid(Sender).DataSource.DataSet.EnableC
TDBGrid(Sender).DataSource.DataSet.FreeBookmark(FBookMark);
FblSelect := F
FCurrNo := 0;
FOldNo := 0;
TDBGrid(Sender).I
FBookMark := TDBGrid(Sender).DataSource.DataSet.GetBookM
FOldNo := TDBGrid(Sender).DataSource.DataSet.RecNo;
FblSelect := T
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:305895次
积分:4176
积分:4176
排名:第6176名
原创:99篇
转载:33篇
评论:39条
(2)(6)(1)(6)(3)(1)(1)(1)(1)(1)(2)(6)(10)(4)(1)(2)(2)(12)(2)(10)(4)(1)(9)(7)(6)(4)(9)(18)

参考资料

 

随机推荐