分享:在表格grid控件中增加复选框checkbox的方法(更新:增加grid中“鼠标+键盘”选择行记录)
分享1:在表格grid控件中增加复选框checkbox的方法
在命令窗口运行以下代码看效果:
说明:只有鼠标在checkbox上点击时才选中,点击其他地方无效。
程序代码:
PUBLIC oform1
oform1=NEWOBJECT("form1")
oform1.Show
RETURN
*-- 时间戳: 03/28/19 04:45:09 PM
DEFINE CLASS form1 AS form
Height = 428
Width = 461
DoCreate = .T.
AutoCenter = .T.
Caption = "Form1"
Name = "Form1"
ADD OBJECT grid1 AS grid WITH ;
ColumnCount = 3, ;
DeleteMark = .F., ;
Height = 384, ;
Left = 24, ;
RecordSource = "table1", ;
Top = 24, ;
Width = 421, ;
AllowCellSelection = .F., ;
Name = "Grid1", ;
Column1.Alignment = 2, ;
Column1.ControlSource = "", ;
Column1.Sparse = .F., ;
Column1.Name = "Column1", ;
Column2.ControlSource = "", ;
Column2.Name = "Column2", ;
Column3.ControlSource = "", ;
Column3.Name = "Column3"
PROCEDURE Load
CREATE CURSOR Table1 (Fselect L, Fname C(10), Fage N(3))
INSERT INTO Table1(Fselect , Fname , Fage) VALUES (.T., "姓名1", 30)
INSERT INTO Table1(Fselect , Fname , Fage) VALUES (.T., "姓名2", 60)
INSERT INTO Table1(Fselect , Fname , Fage) VALUES (.T., "姓名3", 41)
INSERT INTO Table1(Fselect , Fname , Fage) VALUES (.T., "姓名4", 25)
INSERT INTO Table1(Fselect , Fname , Fage) VALUES (.T., "姓名5", 10)
INSERT INTO Table1(Fselect , Fname , Fage) VALUES (.T., "姓名6", 28)
INSERT INTO Table1(Fselect , Fname , Fage) VALUES (.T., "姓名7", 40)
INSERT INTO Table1(Fselect , Fname , Fage) VALUES (.T., "姓名8", 20)
INSERT INTO Table1(Fselect , Fname , Fage) VALUES (.T., "姓名9", 25)
INSERT INTO Table1(Fselect , Fname , Fage) VALUES (.T., "姓名10",30)
GO TOP
ENDPROC
PROCEDURE init
thisform.grid1.Column1.addobject("check1","checkbox")
thisform.grid1.column1.check1.AutoSize =.T.
thisform.grid1.column1.check1.Centered = .T.
thisform.grid1.column1.check1.Caption = ""
thisform.grid1.column1.check1.BackStyle = 0
thisform.grid1.column1.check1.Alignment = 2
thisform.grid1.Column1.CurrentControl = "Check1"
ENDPROC
PROCEDURE grid1.Click
Local lnwhere, locheckbox, lnleftchk,llclickchkbox
Dimension lamouseinfo[1]
m.llclickchkbox = .F.
*--------------------------------
* 检测点击时鼠标所在表格的位置
*--------------------------------
* 检测鼠标位置,aMouseInfo第三和第四行包含鼠标指针相对于当前表单的坐标
Amouseobj(lamouseinfo,1)
* lnWhere=3 在表格单元格
If Thisform.grid1.GridHitTest(lamouseinfo[3],lamouseinfo[4], @lnwhere) And lnwhere=3
m.locheckbox = Thisform.grid1.column1.check1
m.lnleftchk = Objtoclient(m.locheckbox,2) &&返回复选框控件相对于表单的左边距
m.llclickchkbox = Between(lamouseinfo[3], m.lnleftchk, m.lnleftchk + locheckbox.Width) &&鼠标是否在复选框上
Endif
If m.llclickchkbox
SELECT table1
Replace fSelect With !fSelect &&如果点击checkbox更新选择状态
Endif
ENDPROC
ENDDEFINE
---------------------------------------------------------
分享2:在grid中“鼠标+键盘”选择行记录的方法
在命令窗口运行以下代码看效果:
说明:选择方式:Ctrl+鼠标单击,Ctrl+鼠标拖动,shift+鼠标单击。
程序代码:
PUBLIC oform1
oform1=NEWOBJECT("form1")
oform1.SHOW
RETURN
*-- 时间戳: 03/29/19 11:33:09 AM
DEFINE CLASS form1 AS FORM
HEIGHT = 428
WIDTH = 461
DOCREATE = .T.
AUTOCENTER = .T.
CAPTION = "Form1"
NAME = "Form1"
ADD OBJECT grid1 AS GRID WITH ;
COLUMNCOUNT = 3, ;
DELETEMARK = .F., ;
HEIGHT = 384, ;
LEFT = 24, ;
RECORDSOURCE = "table1", ;
TOP = 24, ;
WIDTH = 421, ;
ALLOWCELLSELECTION = .F., ;
NAME = "Grid1", ;
highlightbackcolor = RGB(182,202,234),;
highlightforecolor = 0,;
column1.ALIGNMENT = 2, ;
column1.CONTROLSOURCE = "", ;
column1.SPARSE = .F., ;
column1.NAME = "Column1", ;
column2.CONTROLSOURCE = "", ;
column2.NAME = "Column2", ;
column3.CONTROLSOURCE = "", ;
column3.NAME = "Column3"
PROCEDURE LOAD
CREATE CURSOR table1 (fselect l, fname c(10), fage N(3))
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名01",30)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名02",60)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名03",41)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名04",25)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名05",10)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名06",28)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名07",40)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名08",20)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名09",25)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名10",55)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名11",16)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名12",38)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名13",44)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名14",60)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名15",29)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名16",68)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名17",80)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名18",50)
INSERT INTO table1(fselect , fname , fage) VALUES (.T., "姓名19",22)
GO TOP
ENDPROC
PROCEDURE INIT
THISFORM.grid1.column1.ADDOBJECT("check1","checkbox")
THISFORM.grid1.column1.CURRENTCONTROL = "Check1"
THISFORM.grid1.column1.check1.AUTOSIZE =.T.
THISFORM.grid1.column1.check1.CENTERED = .T.
THISFORM.grid1.column1.check1.CAPTION = ""
THISFORM.grid1.column1.check1.BACKSTYLE = 0
THISFORM.grid1.column1.check1.ALIGNMENT = 2
THISFORM.grid1.column1.header1.caption = "选择"
THISFORM.grid1.column2.header1.caption = "姓名"
THISFORM.grid1.column3.header1.caption = "年龄"
THISFORM.ADDOBJECT("TEMPGOTFOCUSTEXTBOX","TextBox")
THIS.ADDPROPERTY("MouseState","")
THIS.ADDPROPERTY("KeyPressState","")
THIS.ADDPROPERTY("nStartRec",0)
THIS.ADDPROPERTY("nEndRec",0)
THIS.ADDPROPERTY("nMinRecno",0)
THIS.ADDPROPERTY("nMaxRecno",0)
LOCAL lcselitembackcolor,lcunselitembackcolor,lcstr
WITH THISFORM.grid1.column1
lcselitembackcolor = "RGB(182,202,234)"
lcunselitembackcolor = TRANSFORM(THISFORM.grid1.BACKCOLOR)
lcstr="IIF(fSelect," + lcselitembackcolor + "," + lcunselitembackcolor + ")"
.PARENT.SETALL("DynamicBackColor",lcstr,"COLUMN")
ENDWITH
ENDPROC
PROCEDURE grid1.MOUSEDOWN
LPARAMETERS nbutton, nshift, nxcoord, nycoord
LOCAL lccursor,llonselect,lnwhere_out,lnrow_out,lncol_out,lnoldendrec,lnrecno
LOCAL ARRAY laselid(1)
m.lccursor="table1"
SELECT COUNT(*) ;
FROM (m.lccursor) ;
WHERE NOT DELETED() ;
INTO ARRAY nreccount
IF nreccount(1)=0
RETURN
ENDIF
THIS.GRIDHITTEST(nxcoord,nycoord,@lnwhere_out,@lnrow_out,@lncol_out)
SELECT COUNT(*) FROM (m.lccursor) WHERE fselect INTO ARRAY selid
WITH THISFORM
DO CASE
CASE nbutton=2 AND nshift=0 &&右击鼠标
m.llonselect=EVALUATE(m.lccursor+".fSelect")
m.lnrecno=RECNO()
DO CASE
CASE m.llonselect AND selid(1)#0 &&在选中区,并且之前是选中操作
.tempgotfocustextbox.SETFOCUS
.mousestate="RC_InSel"
CASE !m.llonselect AND selid(1)#0 &&不在选中区,并且之前是选中操作
UPDATE (m.lccursor) SET fselect=.F. WHERE fselect
.mousestate="RC_OutSel"
GO m.lnrecno IN (m.lccursor)
CASE !m.llonselect AND selid(1)=0
.mousestate="RC_NoSel"
ENDCASE
CASE nbutton=1 AND nshift=0 AND lnwhere_out=3 &&左击鼠标
.nstartrec=RECNO(m.lccursor)
.nendrec=0
UPDATE (m.lccursor) SET fselect=.F. WHERE fselect
GO .nstartrec IN (m.lccursor)
.mousestate="LC_OutSel"
CASE nbutton=1 AND nshift=1 &&Shift+单击鼠标
m.lnoldendrec =.nendrec
.nendrec=RECNO(m.lccursor)
IF NOT INLIST(.mousestate,"shift+leftclick","ctrl+leftclick")
UPDATE (m.lccursor) SET fselect=.F. WHERE fselect
ENDIF
IF .nendrec#0
UPDATE (m.lccursor) SET fselect=.F. WHERE BETWEEN(RECNO(),MIN(m.lnoldendrec,.nstartrec),MAX(m.lnoldendrec,.nstartrec))
ENDIF
UPDATE (m.lccursor) SET fselect=.T. WHERE BETWEEN(RECNO(),MIN(.nendrec,.nstartrec),MAX(.nendrec,.nstartrec))
GO .nendrec IN (m.lccursor)
.mousestate="shift+leftclick"
CASE nbutton=1 AND nshift=2 &&Ctrl+单击鼠标
.nstartrec=RECNO(m.lccursor)
.nendrec=0
.nminrecno = RECNO(m.lccursor)
.nmaxrecno = RECNO(m.lccursor)
nchildid = RECNO(m.lccursor)
IF NOT INLIST(.mousestate,"shift+leftclick","ctrl+leftclick")
UPDATE (m.lccursor) SET fselect=.F. WHERE fselect
ENDIF
UPDATE (m.lccursor) SET fselect=!fselect WHERE RECNO()=nchildid
GO .nstartrec IN (m.lccursor)
.mousestate="ctrl+leftclick"
ENDCASE
IF nbutton=1 AND INLIST(nshift,1,2)
.tempgotfocustextbox.SETFOCUS
ENDIF
SELECT (m.lccursor) &&此语句很重要,曾出现不能一次单击选中的问题
ENDWITH
ENDPROC
PROCEDURE grid1.MOUSEMOVE
LPARAMETERS nbutton, nshift, nxcoord, nycoord
LOCAL lnwhere_out,lnrow_out,lncol_out
LOCAL lccursor
m.lccursor="table1"
WITH THISFORM
IF nbutton=1 AND nshift=2 &&INLIST(nShift,0,2)
.grid1.GRIDHITTEST(nxcoord,nycoord,@lnwhere_out,@lnrow_out,@lncol_out)
.grid1.ACTIVATECELL(lnrow_out,lncol_out)
.nendrec = RECNO(m.lccursor)
.nminrecno = MIN(.nendrec,.nstartrec,.nminrecno)
.nmaxrecno = MAX(.nendrec,.nstartrec,.nmaxrecno)
*将之前选中区域全部取消
UPDATE (m.lccursor) SET fselect = .F. WHERE BETWEEN(RECNO(),.nminrecno,.nmaxrecno)
*更新选中区域
UPDATE (m.lccursor) SET fselect = .T. WHERE BETWEEN(RECNO(),MIN(.nendrec,.nstartrec),MAX(.nendrec,.nstartrec))
GO .nendrec IN (m.lccursor)
.tempgotfocustextbox.SETFOCUS
*thisform.oCurrentEditTree=this
ENDIF
ENDWITH
ENDPROC
ENDDEFINE
[此贴子已经被作者于2019-3-29 14:12编辑过]










