1

我想在 c++ 构建器中为 stringGrid 的每一行添加复选框。据我所知,特定列的每个单元格都不可能拥有自己的子控件。所以我该怎么做

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;

}
4

1 回答 1

2

技术上讲,可以将子控件放在 a 中TStringGrid(您的示例代码只是缺少一个l->Parent = StringGrid1赋值),但是管理这样的控件并不容易,尤其是在网格可滚动的情况下。

更好的解决方案是所有者绘制网格,通过切换到 aTDrawGrid并使用其OnDrawCell事件,因此您可以调用 Win32 APIDrawFrameControl()DrawThemeBackground()函数将复选框图像绘制到网格上。然后,您可以使用单独的数组/列表来跟踪复选框“状态”,并根据OnMouse...需要使用网格的事件来切换这些“状态”,Invalidate()每当复选框更改“状态”时调用网格的方法,以便您可以触发重绘显示它。但是如果你走这条路,你最好切换到虚拟 ListView 或虚拟 TreeView 而不是使用网格。

另一种解决方案是切换到将TListViewViewStyle属性设置为vsReportmode 并将其CheckBoxes属性设置为 true 的 a。

于 2013-02-03T23:12:15.933 回答