背景
对下面的表格控件,想实现灰色单元格部分所有的列不允许修改,而白色单元格部分,仅“显示”列才能修改。
需求可整理如下: 1.“列名称”都不允许修改;
2.“显示列”灰色部分不允许修改,而白色单元格可以修改
表格控件
编写逻辑
1.在操作过程中,为实现<需求1:“列名称”都不允许修改>可以通过对表格控件的属性
ColumnEditable进行设置:
Handle.ColumnEditable = [true,false]
2.基于以上,若是通过选中单元格后再进行修改,则可以通过表格回调
CellSelectionCallback进行设置,如下面截图所示
箭头所示部分为选中单元格,选中后再修改单元格内容
对应的回调写法为:
if max(source.Selection==[2 3 ])==1 % 表格控件的属性Multiselect为‘off’,属性SelectionType为‘row’ Handle.ColumnEditable(1) =false; else; Handle.ColumnEditable(1) =true; end
这样就实现了选中单元格时,通过控制表格属性ColumnEditable的值来实现选中单元格的是否允许修改。
3.在2中的设置方式,仅支持选中单元格内容编辑,但对于本次项目中的checkbox的修改却是不合适的。这是因为在MATLAB 2023b版本中,在ColumnEditable(1)=true时,直接点击灰色的“显示”列中的checkbox进行修改是不会首先触发表格回调CellSelectionCallback的。
为解决这个问题,还需要使用表格回调CellEditCallback来进行设置,对应的编写逻辑为,若修改的数据位于灰色单元格部分,则直接给修改后的数据重新再次赋值为默认数据(event.PreviousData),对应的回调内容编写如下:
if max(event.Indices(:,1)==[ 2 3 ])==1 % 表格控件的属性Multiselect为‘off’,属性SelectionType为‘row’ Handle.ColumnEditable(1) =false; source.Data(event.Indices(:,1),1) ={event.PreviousData}; % 程序执行到此时,通过强制将PreviousData再次赋值给表格控件来实现表格内容的伪保持 else; Handle.ColumnEditable(1) =true; end
选中第二行时,对单元[4,1]的checkbox(箭头部分)进行修改时,此时true已经变成false,下次需要再次赋值为false
强调
在情况3中,表格内容修改时(如上图箭头所示),回调CellEditCallback已经触发,但表格控件的source.Selection还等于2(也就是说回调CellSelectionCallback此时还没有触发)。也就是说回调触发优先级排序上,回调CellEditCallback>回调CellSelectionCallback。