我有一个派生自TableLayoutPanel的类。这个类组合表格(网格3x8)并在某些单元格中添加一些复选框。所有这些都是通过覆盖函数InitLayout()来完成的。
public class TableLayoutPanelHours : TableLayoutPanel
{
protected override void InitLayout()
{
RowCount = 3;
ColumnCount = 8;
// Set some column and row styles
RowStyles[0].SizeType = SizeType.Percent;
RowStyles[0].Height = (100 / RowCount);
// ... etc ...
// ... create checkbox with the name checkbox1
Controls.Add(checkbox1, 1, 1); // Put in cell 1x1
// ... etc ...
}
}
构建完成后,可以从VS2010的工具箱中获取控件。
然后,将控件放在一个简单的Windows窗体上,有些事情发生在我不是用户身上: - 在设计模式下,控件还没有化妆。 TableLayoutPanel显示默认的2x2网格,复选框位于一个奇怪的地方。运行后,控件正确显示(3x8网格与正确位置的复选框) - 并且:在Form的InitializeComponent()中,我看到这些行出现:
//
// tableLayoutPanelHours1
//
this.tableLayoutPanelHours1.ColumnCount = 8;
this.tableLayoutPanelHours1.ColumnCount = 3;
this.tableLayoutPanelHours1.ColumnStyles.Add(new System.Windows.Forms.ColumnStyle(System.Windows.Forms.SizeType.Percent, 50F));
// ....
我已经排除了这些行在Windows窗体的InitializeComponent()中不可见,但为什么会发生这种情况?
感谢。
答案 0 :(得分:0)
你正在与设计师争夺TLP。这是一个自定义的,因为您可以通过它在设计模式中的行为方式清楚地看到它。使用InitLayout()方法初始化TLP是不正确的,为时已晚。你应该在构造函数中这样做。
但是,这仍然无法满足您的需求,TLP设计人员在初始化为2x2时会对行数和列数进行硬编码。它无法处理在设计时更改它的代码(就像你在InitLayout中所做的那样),没有要监听的事件。你将不得不放弃那位设计师。
应该可以,因为你已经按照你想要的方式初始化了TLP。使用[Designer]属性回退到ControlDesigner。如果这对您的控制很困难,那么您将不得不创建自己的设计师。使用Reflector查看内部的TableLayoutPanelDesigner类以获得一个开始。请注意,它不是一个简单的设计师。
您在InitializeComponent中看到了这些属性赋值,因为这些属性上的[DefaultValue]属性声明了不同的默认值。您可以通过向您的类添加私有ShouldSerializeRowCount(和ColumnCount)方法来解决此问题。返回false以防止属性被序列化。