2012-05-08 6 views
0

デザイン時にカスタムコントロールのプロパティの値を正しく読み取るにはどうすればよいですか?カスタムコントロールのプロパティを読み取ると、コンストラクタで0が返されます。

現在、行と列はコントロールのプロパティリスト(idenetとしてのvsnet)に設定されていますが、コントロールのコンストラクターから読み取ると両方のプロパティーは0を返します。私は、アプリケーションの開始時にプロパティが割り当てられる前にコンストラクタが実行されていると思われます。

これを行う正しい方法は何ですか?

using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Text; 
    using System.ComponentModel; 

    namespace HexagonalLevelEditor.HexLogic{ 

     class HexGrid : System.Windows.Forms.Panel { 

      public HexGrid() { 
       for(int c = 0; c < this.Columns; ++c) { 
        for(int r = 0; r < this.Rows; ++r) { 
         HexCell h = new HexCell(); 
         h.Width = 200; 
         h.Height = 200; 
         h.Location = new System.Drawing.Point(c*200, r*200); 
         this.Controls.Add(h); 
        } 
       } 
      } 

      private void InitializeComponent() { 
       this.SuspendLayout(); 
       this.ResumeLayout(false); 
      } 

      private int m_rows; 
      [Browsable(true), DescriptionAttribute("Hexagonal grid row count."), Bindable(true)] 
      public int Rows { 
       get { 
        return m_rows; 
       } 

       set { 
        m_rows = value; 
       } 
      } 

      private int m_columns; 
      [Browsable(true), DescriptionAttribute("Hexagonal grid column count."), Bindable(true)] 
      public int Columns { 
       get{ 
        return m_columns; 
       } 

       set { 
        m_columns = value; 
       } 
      } 
     } 
    } 
+1

もちろん、コンストラクタはプロパティの割り当ての前に実行されます。いずれかのプロパティーが変更されたときにグリッドがリフレッシュされるようにする必要があります。 – SimpleVar

+0

Loadイベントでそれを行う –

+0

duh、ありがとう。 –

答えて

1

最終的には、いずれかのプロパティの行/列が変更されたときに必ずグリッドをリメイクします。したがって、グリッドを再作成し、プロパティが設定されているときはいつでも呼び出す方法が必要です。

public void RemakeGrid() 
{ 
    this.ClearGrid(); 

    for(int c = 0; c < this.Columns; ++c) 
    { 
     for(int r = 0; r < this.Rows; ++r) 
     { 
      HexCell h = new HexCell(); 
      h.Width = 200; 
      h.Height = 200; 
      h.Location = new System.Drawing.Point(c*200, r*200); 
      this.Controls.Add(h); 
     } 
    } 
} 

private int m_rows; 

[Browsable(true), DescriptionAttribute("Hexagonal grid row count."), Bindable(true)] 
public int Rows 
{ 
    get 
    { 
     return m_rows; 
    } 
    set 
    { 
     m_rows = value; 
     this.RemakeGrid(); 
    } 
} 

// Same goes for Columns... 
+0

偉大な答えをありがとう! –

関連する問題