2010-08-14 81 views
1

我有一個從TableLayoutPanel派生的類。此類化妝tabel糾正(網格3x8)並在一些單元格中添加一些複選框。所有這些都是通過覆蓋函數InitLayout()來完成的。覆蓋Windows(Form)控件TableLayoutPanel問題

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網格和複選框在一個奇怪的地方。運行後,控制正確顯示(3×8網格複選框在正確的地方) - 和:在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

您正在與TLP的設計師進行戰鬥。這是一個自定義的,你可以清楚地看到它在設計模式下的行爲。使用InitLayout()方法初始化TLP是不正確的,這太遲了。您應該在構造函數中完成它。

但是,TLP設計器在初始化爲2x2時對行數和列數進行了硬編碼,但仍然無法滿足您的需求。它不能處理在設計時更改它的代碼(就像你在InitLayout中做的那樣),沒有事件要聽。你將不得不放棄那個設計師。

應該沒關係,因爲你已經按照你想要的方式初始化了TLP。使用[Designer]屬性返回到ControlDesigner。如果您的控制困難,那麼您將不得不創建自己的設計師。使用Reflector來查看內部的TableLayoutPanelDesigner類,以獲得開始。當心它不是一個簡單的設計師。

您會在InitializeComponent中看到這些屬性分配,因爲這些屬性的[DefaultValue]屬性聲明瞭不同的默認值。您可以通過向班級添加一個私人的ShouldSerializeRowCount(和ColumnCount)方法來解決這個問題。返回false以防止該屬性被序列化。

+0

漢斯,謝謝你的信息!克利裏。謝謝。 – robertpnl 2010-08-14 20:35:38

+0

不客氣。並感謝您在我無法幫助的答案數量方面取得領先。 300正在接近! – 2010-08-14 23:40:54