2013-03-01 6 views
0

flowLayoutPanel1에로드시 4 개의 동적 버튼과 정적 저장 버튼을 생성하는 작은 프로그램이 있습니다.저장 버튼을 클릭 할 때 동적 제어 상태 저장

내 목표는 동적 버튼 색상을 저장하여 양식을 다시로드하거나 다시 열 때 동적 버튼의 색상이 저장된 것과 동일한 상태로 다시로드되도록하는 것입니다.

아래에는 내가 시도한 것을 보여주기 위해 주석 처리 된 코드가 포함됩니다. 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

"정적으로 저장하려면 버튼을 만들면 작동하지만 사용하는 방법은 괜찮습니다." 그래서 문제는 무엇인지, 나는 당신이 무슨 문제인지 확신 할 수 없다. 명확히 해 주시겠습니까? –

+0

앱에 4 개의 버튼이 있지만 코드에 4 개의 버튼을 처리 할 논리가 없습니다. (직렬화뿐만 아니라 색상 변경도 가능) – Steve

답변

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