覆盖Windows(窗体)控件TableLayoutPanel问题

时间:2010-08-14 15:17:18

标签: c# windows-forms-designer

我有一个派生自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()中不可见,但为什么会发生这种情况?

感谢。

1 个答案:

答案 0 :(得分:0)

你正在与设计师争夺TLP。这是一个自定义的,因为您可以通过它在设计模式中的行为方式清楚地看到它。使用InitLayout()方法初始化TLP是不正确的,为时已晚。你应该在构造函数中这样做。

但是,这仍然无法满足您的需求,TLP设计人员在初始化为2x2时会对行数和列数进行硬编码。它无法处理在设计时更改它的代码(就像你在InitLayout中所做的那样),没有要监听的事件。你将不得不放弃那位设计师。

应该可以,因为你已经按照你想要的方式初始化了TLP。使用[Designer]属性回退到ControlDesigner。如果这对您的控制很困难,那么您将不得不创建自己的设计师。使用Reflector查看内部的TableLayoutPanelDesigner类以获得一个开始。请注意,它不是一个简单的设计师。

您在InitializeComponent中看到了这些属性赋值,因为这些属性上的[DefaultValue]属性声明了不同的默认值。您可以通过向您的类添加私有ShouldSerializeRowCount(和ColumnCount)方法来解决此问题。返回false以防止属性被序列化。