2013-03-01 132 views
0

我有一个小程序,在加载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(); 
     } 



    } 

什么我应该改变,因此任何建议它适合我吗?谢谢

+0

“但是,我使用的方法工作正常,如果创建我的按钮来保存静态。”那么最新的问题,我不知道你是什么问题。你能澄清吗? – 2013-03-01 13:58:43

+0

你的应用程序有4个按钮,但是你的代码没有任何逻辑来处理4个按钮。 (不仅用于序列化,还用于改变颜色) – Steve 2013-03-01 13:58:48

回答

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