我想在c ++ builder中为checkboxGrid的每一行添加复选框。据我所知,特定列的每个单元都不可能有自己的子控件。那我该怎么办
for (int i = 1; i < this->StringGrid1->RowCount; i++) {
this->StringGrid1->Cells[0][i]=IntToStr(i);
TCheckBox *l=new TCheckBox(this->StringGrid1);
l->Name="label"+IntToStr(i);
l->Caption="OK";
l->Visible=true;
}
答案 0 :(得分:2)
技术上可以将子控件放在TStringGrid
中(您的示例代码只缺少l->Parent = StringGrid1
分配),但管理此类控件并不容易,特别是如果网格是可滚动的。
更好的解决方案是通过切换到TDrawGrid
并使用其OnDrawCell
事件来自主绘制网格,以便您可以调用Win32 API DrawFrameControl()
或{{3}函数将复选框的图像绘制到网格上。然后,您可以使用单独的数组/列表来跟踪“状态”复选框,并使用网格的OnMouse...
事件根据需要切换这些“状态”,每当复选框时调用网格的Invalidate()
方法更改“状态”,以便您可以触发重绘以显示它。但是如果你走这条路,你最好切换到虚拟ListView或虚拟TreeView,而不是使用网格。
另一种解决方案是切换到将TListView
属性设置为ViewStyle
模式且其vsReport
属性设置为true的CheckBoxes
。