分享:在表格grid控件中增加复选框checkbox的方法(更新:增加grid中“鼠标+键盘”选择行记录)
grid添加复选框及选择记录.rar
(8.49 KB)
分享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编辑过]