表格框中的行块着色<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />你好,
我有一个表格框,其中包含大量行,这些行自然地分组为每行三行的块(因为第 1 到 3 行与一种化合物相关,第 4 到 6 行与另一种化合物相关,第 7 到 9 行与第三行相关, 等等)。我想对行进行着色以使化合物块在视觉上更容易区分 - 所以我想对第 1 到 3 行进行着色,然后将第 4 到 6 行保留为白色,然后对第 7 到 9 行进行着色,然后将第 10 到第 12 行保留白色等(一次对三行着色的要求意味着我不能只使用“<< 阴影交替行”属性。)
我可以使用“<< set selected rows()”属性预先选择三行的每个备用块,但是如果用户随后单击任何行或以其他方式选择/取消选择它们,则该着色模式将丢失.因此,我在“<< set row change function”属性中应用了相同的属性 - 因此,如果用户单击表格上的任意位置,则会立即重新应用阴影。我最终得到这样的结果:
名称列表 = 重复({“A”},3)||重复({“B”},3)||重复({“C”},3)||重复({“D”},3) ||重复({“E”},3)||重复({“F”},3)||重复({“G”},3)||重复({“H”},3);
三列表 = {1, 2, 3, 7, 8, 9, 13, 14, 15, 19, 20, 21};
tb = 表格框(
String Col Box("名称", nameList),
Number Col Box("First", index(1, 24)),
Number Col Box("第二个", index(25, 48)),
Number Col Box("第三个", index(49, 72)),
<< 设置所选行颜色(“青色”),
<< 设置选定的行(三个列表),
<< 设置行更改功能(tb << 设置选定行(threeList)),
<< 设置可滚动(1),
<< 设置列边框(1),
<< 设置下划线标题(1)
);
new window("我的窗口", tb);
这可行,但似乎有点令人费解。任何人都可以提出一种更简单的方法吗?
非常感谢。
回复:在表格框中对行块进行着色只是为了解决您对使用新数据视图的一些担忧:
处理用户操作所需要做的就是添加行状态处理程序。它将检测更改并分支到一个函数,您可以在其中以编程方式解决问题。例如在这种情况下,如果视图已排序,您可以将单元格颜色重置为新顺序
F =功能({一个} ,<重置单元格颜色> ) ;
rs = dt <<制作行状态处理程序( F ) ;
回复:在表格框中对行块进行着色谢谢大家 - 这对所有方面都非常有帮助,我将把问题打勾为已经解决,因为我现在有足够的东西来解决我的原始查询。
我尝试了 Vince 的建议,即在创建具有所需选择的表格框后设置“<< set selectable rows(0)”属性,但不幸的是,似乎这样做实际上会在生效之前清除选择。
我已经复制了 Jim 的脚本,因为我总是对 eval()、substitute() 和 expr() 结构组合的语法有困难,并且有工作示例来适应让生活变得更轻松!实际上,我至少暂时会保留我的表格框,因为我正在创建的报告的结构更适合该输出格式 - 但新数据框路线是我以前没有考虑过的, 并且很可能在未来很有用。
在一次私人交流中也有人向我指出,我可能需要考虑用户随后尝试按其中一个列对表格框进行排序(他们可以通过右键单击轻松完成)对我自己的解决方案的影响.实际上,在这种情况下这不是问题,因为表格框是最终报告的一部分,在其中进一步对其进行排序没有用处,但这一点得到了很好的理解。
最后,我顺便注意到“<< set row change function()”属性实际上不会工作除非“<< set selected rows()”属性明确选择了一个或多个行,或者“<< set selectable rows(1)”属性已包含在属性设置列表中。这只是一件小事,但它让我感到困惑,直到我意识到在我能够做我想做的事情之前至少需要其中一个。
再次,非常感谢大家。
回复:在表格框中对行块进行着色我处理这个问题的方法是使用 New Data Box() 函数,而不是使用 Table Box(),而是使用数据表。有了它,您可以为单元格等着色,并充分利用数据表的所有编辑功能。
这是一个脚本来说明我在说什么:
名称默认到这里( 1 ) ;
dt =打开( "$SAMPLE_DATA/大类.jmp" ,无形的) ;
// 选择 3 行的组
为了( ķ = 1 , ķ <= 3 , ķ ++,
为了(一世= ķ ,一世<= N行( dt ) ,一世=一世+ 6 ,
行状态(一世) =选定的州( 1 )
)
) ;
名单=作为列表( dt <<获取选定的行) ;
dt <<清除选择;
// 遍历所有列并设置单元格颜色
碰撞= dt <<获取列名( “细绳” ) ;
为了(一世= 1 ,一世<= N 项(碰撞) ,一世++,
评估(
代替(
表达式(
柱子( dt ,碰撞[一世] ) <<彩色细胞( { “红色的” , _名单_ } )
) ,
表达式( _名单_ ) ,名单
)
)
) ;
//设置显示窗口
净重=新窗户( “展示” ,
V 列表框(
结核病=文本框( “ 这个例子” ) ,
vlb = V 列表框()
)
) ;
数据库= dt <<新数据框() ;
vlb <<附加(数据库) ;
数据库<<关闭侧面板( 1 ) ;
结核病<<设置字体大小( 20 ) ;
它产生以下显示窗口

回复:在表格框中对行块进行着色可以做这样的事情。
指数 = 1 :: 99 ;
新窗户( “窗户” , tb =表格框( NumberColBox ( “柱子” , 指数)));
n= 3 ; //您可以将其更改为您的组的任何数字
行 =位置(模组(地面((指数- 1 )/n), 2 )); // 只给出交替的 n 个脉冲组
结核病<<设置选定的行(行);
希望这可以帮助。干杯。
*编辑*刚刚意识到这不是您可能要问的部分。对不起。
您可以只选择行,然后使它们无法选择吗?
tb << 设置可选行(0);