0

設計時に設定されたカスタム コントロール プロパティの値を正しく読み取るにはどうすればよいですか?

現在、行と列はコントロールのプロパティ リスト (vs.net as ide) に設定されていますが、コントロールのコンストラクタから読み取ると、両方のプロパティが 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;
                }
            }
        }
    }
4

1 に答える 1

1

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

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...
于 2012-05-08T03:25:38.877 に答える