RE: Grid Control: how disable checkbox(s)?
- Posted by Phil Russell <pg_russell at lineone.net> Feb 17, 2003
- 418 views
Dan, You can set an entire column of checkboxes to be disabled by setting the column property of EGW_COL_EDITABLE to False. Disabling individual cells is a bit harder as this property is not (yet!) supported for individual cells - eventually I intend that you will be able to set most column properties for an individual cell but I this is dependent on some other changes first. I have come up with a workaround which is a little clunky but seems to work. See below... Regards, Phil Dan Moyer wrote: > Phil, > > How could I cause checkbox(s) in a grid to become disabled? > > Dan Moyer > Code follows: -- code generated by Win32Lib IDE v0.14.2 include Win32lib.ew without warning ---- -- Window Window1 constant Window1 = createEx( Window, "Grid Control with CheckBoxes", 0, Default, Default, 600, 300, 0, 0 ) constant PushButton2 = createEx( PushButton, "Select File", Window1, 484, 20, 88, 28, 0, 0 ) constant PushButton3 = createEx( PushButton, "Process Data", Window1, 484, 72, 88, 28, 0, 0 ) ---- include eugrid.ew atom void integer aGrid, colFileName, colCB1, colCB2, colFileDir -- Save state of last checkbox clicked object last_checkbox_state -- Create grid, create parms=(parent, x, y, width, height, show_window) aGrid = EGW_CreateGrid( Window1, 10, 15, 450, 200, True ) -- no row header void = EGW_SetGridProperty( aGrid, EGW_ROW_HEADER_WIDTH, 0) --***Phil: Make grid look a bit more like a list view void = EGW_SetGridProperty( aGrid, EGW_NULL_GRID_COLOR, BrightWhite) void = EGW_SetGridProperty( aGrid, EGW_LINE_COLOR, BrightWhite) void = EGW_SetGridProperty( aGrid, EGW_CELL_BORDER, False) -- Filename column -- ***Phil: Make this a protected edit field to get highlighting --colFileName = EGW_AddColumn( aGrid, "FileName", 200, EGW_LAST,EGW_STATIC,1 ) colFileName = EGW_AddColumn( aGrid, "FileName", 100, EGW_LAST, EGW_EDIT,1 ) --void = EGW_SetColumnProperty(aGrid, colFileName, EGW_COL_ALIGN,EGW_CENTER) void = EGW_SetColumnProperty(aGrid, colFileName, EGW_COL_EDITABLE, False) --void = EGW_SetColumnProperty( aGrid, colFileName, EGW_COL_WIDTH, 75 ) -- checkbox columns: colCB1 = EGW_AddColumn(aGrid, "Action1 - row 1 disabled", 120, EGW_LAST, EGW_CHECKBOX, 2 ) void = EGW_SetColumnProperty(aGrid, colCB1, EGW_COL_ALIGN, EGW_CENTER) colCB2 = EGW_AddColumn(aGrid, "Action2 - all disabled", 120, EGW_LAST, EGW_CHECKBOX, 3 ) void = EGW_SetColumnProperty(aGrid, colCB2, EGW_COL_ALIGN, EGW_CENTER) void = EGW_SetColumnProperty(aGrid, colCB2, EGW_COL_EDITABLE, False) -- file directory column: colFileDir = EGW_AddColumn( aGrid, "FileDirectory", 226, EGW_LAST, EGW_STATIC, 4 ) --void = EGW_SetColumnProperty(aGrid, colFileDir, EGW_COL_ALIGN,EGW_CENTER) ---- procedure PushButton2_onClick (integer self, integer event, sequence params)--params is () seq fName, dirName, fullPathName, temp seq newRow int row, posBS -- posBS is position of back-slash in file name temp = {} -- get a file name fName = getOpenFileName( Window1, current_dir() & "\\", "" ) -- entered a file name? if length( fName ) = 0 then return end if -- separate filename from dirName: if find('\\',fName) then -- found back-slash -- work from end, remove chars after last back-slash: for n = length(fName) to 1 by -1do if not equal('\\',fName[n]) then temp = prepend(temp,fName[n]) else posBS = n exit end if end for fullPathName = fName dirName = fName[1..posBS -1] fName = temp else dirName = "" end if newRow = {fName,1,1,dirName } -- example relating to adding new row: --global constant EmptyGridRow = {"", 2, "", "", 0, True} -- Add new row to grid: row = EGW_AddDataRow(aGrid, newRow, EGW_LAST) --***Phil: Not necessary unless you are doing database manipulation *** --void = EGW_SetDataRowFlag(aGrid, row, EGW_ROW_NEW, True) -- Go to it? --***Phil: You can't use EGW_LAST here - use row number from EGW_AddDataRowinstead -- void = EGW_ScrollToCell(aGrid, EGW_LAST, colFileName) --repaintWindow(Window1) --***Phil Start -- Repaint window to make sure new row is displayed repaintWindow(aGrid) -- Scroll to first column of new row void = EGW_ScrollToCell( aGrid, row, colFileName ) --***Phil End end procedure setHandler( PushButton2, w32HClick, routine_id("PushButton2_onClick")) ---- procedure PushButton3_onClick (integer self, integer event, sequence params)--params is () object result atom numOfRows numOfRows = EGW_GetRowCount ( aGrid ) for n = 1 to numOfRows do result = EGW_GetDataCellValue ( aGrid, n, 2 ) puts(1, sprint(result)) result = EGW_GetDataCellValue ( aGrid, n, 3 ) puts(1, sprint(result)) puts(1, "\n") end for end procedure setHandler( PushButton3, w32HClick, routine_id("PushButton3_onClick")) procedure onGridEvent (atom self, atom event, sequence parms) atom msg, wParam, lParam sequence cell object cbState msg = parms[1] wParam = parms[2] lParam = parms[3] cell = EGW_GetCurrentCell( aGrid ) -- If checkbox clicked then save state if msg = EGW_LEFTBUTTONDOWN then -- Save checkbox state on mouse down if cell[1]>0 and (cell[2] = colCB1 or cell[2] = colCB2) then -- is a checkbox column last_checkbox_state = EGW_GetDataCellValue ( aGrid, cell[1], cell[2] ) end if -- If checkbox armed by pressing space bar then save state elsif msg = EGW_CELLEDIT then -- Save checkbox state on spacebar down if cell[1]>0 and (cell[2] = colCB1 or cell[2] = colCB2) -- is a checkbox column and wParam = VK_SPACE then last_checkbox_state = EGW_GetDataCellValue ( aGrid, cell[1], cell[2] ) end if -- User has clicked on a cell elsif msg = EGW_LEFTBUTTONUP then -- Process checkbox change of state if cell[1]>0 and (cell[2] = colCB1 or cell[2] = colCB2) then -- is a checkbox column -- get state of clicked checkbox: cbState = EGW_GetDataCellValue ( aGrid, cell[1], cell[2] ) -- Simulate protected checkbox for e.g. cb1 on first row only if cell[1] = 1 and cell[2] = colCB1 then void = EGW_SetDataCellValue( aGrid, cell[1], cell[2], last_checkbox_state ) end if -- Display checkbox state in window title setText( Window1, "Clicked on row number: " & sprint(cell[1]) & ", column id: " & sprint(cell[2]) & " , state: " & sprint(cbState) ) end if end if end procedure setHandler( aGrid, w32HEvent, routine_id("onGridEvent")) WinMain( Window1,Normal )