2013-03-04 151 views
0

您好我试图动态地使用2D阵列创建的按钮的这种4×4栅格的颜色状态保存到XML文档的控制状态:保存当窗体关闭

enter image description here

然而,当我按保存我一直得到这个消息:

我可以使这个工作,如果我使用一维数组的按钮,但不会给我我想要的网格,但当我使用二维数组的按钮它不会工作:

enter image description here

我能改,所以我可以得到这个工作的任何建议都大加赞赏:

这是我的代码,我有:

FormState类:

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

表单代码:

public partial class Form1 : Form 
{ 
     int col = 4; 
     int row = 4; 
     Button[,] buttons; 
     FormState[,] states; 
     public Form1() 
     { 
      InitializeComponent(); 
      buttons = new Button[col, row]; 
      states = new FormState[col, row]; 
     } 

     public void placeRows() 
     { 
      for (int r = 0; r < row; r++) 
      { 
       createColumns(r); 
      } 
     } 

     public void createColumns(int r) 
     { 
      int s = r * 25; //gap 
      for (int c = 0; c < col; c++) 
      { 
       buttons[r, c] = new Button(); 
       buttons[r, c].SetBounds(75 * c, s, 75, 25); 
       buttons[r, c].Text = Convert.ToString(c); 
       buttons[r, c].Click += new EventHandler(grid_Click); 
       panel1.Controls.Add(buttons[r, c]); 
      } 
     } 

     int count = 0; 
     //backcolor change 
     void grid_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--; 
      } 
     } 

     private void Form1_Load(object sender, EventArgs e) 
     { 
      placeRows(); 

      if (File.Exists("config.xml")) 
      { 
       loadConfig(); 
      } 

      for (int i = 0; i < col; ++i) 
      { 
       for (int j = 0; j < row; ++j) 
       { 
        if (states[i,j] != null) 
        { 
         buttons[i,j].BackColor = ColorTranslator.FromHtml(states[i,j].ButtonBackColor); 
        } 
       } 
      } 
     } 

     //method to load file 
     private void loadConfig() 
     { 
      XmlSerializer ser = new XmlSerializer(typeof(FormState[])); 
      using (FileStream fs = File.OpenRead("config.xml")) 
      { 
       states = (FormState[,])ser.Deserialize(fs); 
      } 
     } 

     private void writeConfig() 
     { 
      for (int i = 0; i < col; i++) 
      { 
       for (int j = 0; j < row; j++) 
       { 
        if (states[i,j] == null) 
        { 
         states[i,j] = new FormState(); 
        } 
        states[i,j].ButtonBackColor = ColorTranslator.ToHtml(buttons[i,j].BackColor); 
       } 

       using (StreamWriter sw = new StreamWriter("config.xml")) 
       { 
        XmlSerializer ser = new XmlSerializer(typeof(FormState[])); 
        ser.Serialize(sw, states); 
       } 
      } 
     } 

     private void btnSave_Click(object sender, EventArgs e) 
     { 
      writeConfig(); 
     } 
    } 
+0

在您的例外中单击“查看详细信息”,它很可能说您的课程没有标记为可序列化 – 2013-03-04 01:04:43

+0

不,它显示:{“生成XML文档时发生错误。”} – Tacit 2013-03-04 01:07:15

+0

如果您继续钻探?内部异常? – 2013-03-04 01:08:08

回答

1

这可能不是一个理想的解决方案(我还没有尝试过,所以它可能甚至不工作),但你可以创建一个嵌套的数组,而不是2-d阵列。像

FormStates[][] states = new FormStates[row][]; 
for(Int32 i = 0; i < row; i++) 
{ 
    states[i] = new FormStates[col]; 
} 

使用states[i, j]索引,而不是其他,你会使用states[i][j]。由于1-D数组是可序列化的,所以这可能起作用。

编辑

稍长例如,根据您的代码:

public partial class Form1 : Form 
{ 
    int col = 4; 
    int row = 4; 
    Button[][] buttons; 
    FormState[][] states; 
    public Form1() 
    { 
     InitializeComponent(); 
     buttons = new Button[col][]; 
     states = new FormState[col][]; 
     for(Int32 c = 0; c < col; c++) 
     { 
      buttons[c] = new Button[row]; 
      states[c] = new FormState[row]; 
     } 
    } 

    public void createColumns(int r) 
    { 
     int s = r * 25; //gap 
     for (int c = 0; c < col; c++) 
     { 
      buttons[r][c] = new Button(); 
      buttons[r][c].SetBounds(75 * c, s, 75, 25); 
      buttons[r][c].Text = Convert.ToString(c); 
      buttons[r][c].Click += new EventHandler(grid_Click); 
      panel1.Controls.Add(buttons[r][c]); 
     } 
    } 
} 

这应该足以给你的语法更改代码的其余部分。

您还需要将XmlSerializer声明更改为使用typeof(FormState[][])而不是typeof(FormState[])

+0

不知你能不能给我一个较长的例子请 – Tacit 2013-03-04 17:33:28

+0

我编辑我的答案,包括更长的例子(根据您发布的代码)。希望有所帮助。 – 2013-03-05 04:55:57

+0

感谢队友我得到它的工作 – Tacit 2013-03-06 16:23:28

0

诚然我没有PU牛逼多想这个,但是按照意见,你不能序列化多维数组,所以你可能:如果有必要

[Serializable] 
    public class FormState 
    { 
     public int RowIndex { get; set; } 
     public int ColIndex { get; set; } 
     public string BackColor { get; set; } 
    } 

    [Serializable] 
    public class Layout : Collection<FormState> { 

     public Layout(){} 
    } 

..

 public void SomeCallingMethod() { 
      Layout l = new Layout(); 
      foreach (FormState fs in l) { 
       buttons[fs.RowIndex, fs.ColIndex].BackColor = ColorTranslator.FromHtml(fs.BackColor); 
      }  
     } 

也可以是列表和序列化。

+0

? – Tacit 2013-03-04 17:31:22