0

flowLayoutPanel1読み込み時に 4 つの動的ボタンと静的保存ボタンを生成する小さなプログラムがあります。

私の目的は、動的ボタンの色を保存して、フォームを再読み込みまたは再度開いたときに、動的ボタンの色が保存されたのと同じ状態で読み込まれるようにすることです。

以下に、私が試みたことを示すためにコメントされたコードを含めます。ボタンの状態を保存するためにファイルを使用しxmlており、状態を保持するクラスが含まれています。ただし、ボタンを作成して静的に保存する場合、私が使用している方法は正常に機能します。(私は1つの静的ボタンでのみ試しました)

インターフェース: ここに画像の説明を入力 状態を保持するクラス:

  public class MyFormState
    {
        public string ButtonBackColor { get; set; }
    }

フォームコード:

 public partial class Form1 : Form
    {
        //Form Member
        MyFormState state = new MyFormState();
        Button btn;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            //loading xml file if it exists
            if (File.Exists("config.xml"))
            {
                loadConfig();

            }

            //Genrating dynamic buttons
            //  flowLayoutPanel1.Controls.Clear();
            for (int i = 0; i <= 3; ++i)
            {
                btn = new Button();
                btn.Text = " Equation " + i;

                flowLayoutPanel1.Controls.Add(btn);
                //click event of buttons
                btn.Click += new EventHandler(btn_Click);
            }

           btn.BackColor = System.Drawing.ColorTranslator.FromHtml(state.ButtonBackColor);


        }

        //method to load file
        private void loadConfig()
        {

            XmlSerializer ser = new XmlSerializer(typeof(MyFormState));
            using (FileStream fs = File.OpenRead("config.xml"))
            {
                state = (MyFormState)ser.Deserialize(fs);
            }
        }

        //saving the xml file and the button colors
        private void writeConfig()
        {
            using (StreamWriter sw = new StreamWriter("config.xml"))
            {

                state.ButtonBackColor = System.Drawing.ColorTranslator.ToHtml(btn.BackColor);
                XmlSerializer ser = new XmlSerializer(typeof(MyFormState));
                ser.Serialize(sw, state);
            }
        }
        int count = 0;


        //backcolor change
        void btn_Click(object sender, EventArgs e)
        {
            Button button = sender as Button;

            if (count == 0)
            {
                button.BackColor = Color.Red;
                count++;
            }

            else if (count == 1)
            {
                button.BackColor = Color.Blue;
                count--;
            }
        }

        //save file
        private void btnSave_Click(object sender, EventArgs e)
        {
            writeConfig();
        }



    }

それが私のために働くために私が何を変更すべきかについての提案はありますか? ありがとう

4

1 に答える 1

1

コードは正常に機能しますが、最後のボタンに対してのみです。MyFormState4 つのボタンがありますが、オブジェクトは 1 つしかありません。ボタンを作成するときは、常に同じプライベート フィールドを使用しますbtnMyFormStateしたがって、4 つのオブジェクトと 4 つのボタンの配列が必要です。

MyFormState[] states = new MyFormState[4];
Button[] buttons = new Button[4];

private void Form1_Load(object sender, EventArgs e)
{
    if (File.Exists("config.xml"))
    {
        loadConfig();
    }

    for (int i = 0; i < 4; ++i)
    {
        buttons[i] = new Button();
        buttons[i].Text = " Equation " + i;

        flowLayoutPanel1.Controls.Add(buttons[i]);
        buttons[i].Click += new EventHandler(btn_Click);

        if (states[i] != null)
        {
            buttons[i].BackColor = ColorTranslator.FromHtml(states[i].ButtonBackColor);
        }
    }
}

private void loadConfig()
{
    XmlSerializer ser = new XmlSerializer(typeof(MyFormState[]));
    using (FileStream fs = File.OpenRead("config.xml"))
    {
        states = (MyFormState[])ser.Deserialize(fs);
    }
}

private void writeConfig()
{
    for (int i = 0; i < 4; i++)
    {
        if (states[i] == null)
        {
            states[i] = new MyFormState();
        }
        states[i].ButtonBackColor = ColorTranslator.ToHtml(buttons[i].BackColor);
    }

    using (StreamWriter sw = new StreamWriter("config.xml"))
    {
        XmlSerializer ser = new XmlSerializer(typeof(MyFormState[]));
        ser.Serialize(sw, states);
    }
}
于 2013-03-01T14:23:07.703 に答える