单击“保存”按钮时保存动态控制状态

时间:2013-03-01 13:51:46

标签: c# forms savestate

我有一个小程序,可以在flowLayoutPanel1和静态保存按钮中生成四个动态按钮。

我的目的是保存动态按钮颜色,以便在重新加载或重新打开表单时,动态按钮的颜色将以保存的相同状态加载回来。

下面我将包含我的代码,该代码已被评论以证明我的尝试。 我正在使用xml文件来保存按钮状态,并包含一个保存状态的类。但是,如果创建我的按钮静态保存,我正在使用的方法工作正常。 (我只用一个静态按钮试了一下)

接口: enter image description here 持有状态的类:

  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();
        }



    }

关于我应该改变什么以便它对我有用的任何建议?谢谢

1 个答案:

答案 0 :(得分:1)

您的代码工作正常但仅适用于最后一个按钮。您有4个按钮,但只有一个MyFormState对象。创建按钮时,您始终使用相同的私有字段btn。所以你需要4个MyFormState个对象和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);
    }
}