全局数组大小由另一种形式决定

时间:2011-04-27 18:39:48

标签: c# winforms

我正在尝试创建一个全局二维数组,其大小取决于在另一个表单文本框中输入的两个值。但是,我收到一个错误,指出这些值不是静态的。

public partial class Form2 : Form
{
    Form1 frm = new Form1();
    PictureBox[,] MyArray = new PictureBox[Convert.ToInt32(frm.textbox1.text), Convert.ToInt32(frm.textbox1.text)];
}

由于这些文本框不是静态的(可以更改它们中的值),因此会给出错误。我已经尝试了多种方法来绕过这个问题;我尝试从那些文本框中初始化一个常量,但它给出了同样的错误,我也尝试调整数组大小,但是Array.Resize不起作用,因为它是多维的,而且Array.Copy不起作用,因为我需要数组是全局的

为了让您了解我要尝试做什么,在第一个表单Form1上,用户输入宽度和长度值。然后用户按下确认,并打开Form2。第二种形式Form2将具有一个数组,其大小由用户输入的值确定。此数组将用于处理网格,该网格也由用户输入的值确定。

绕过非静态错误并使用这些值创建数组有什么方法?

3 个答案:

答案 0 :(得分:4)

您无法在字段初始值设定项中引用您的实例(包括实例字段),因为尚未构造实例。

将代码移至Form1 构造函数

答案 1 :(得分:1)

当您在Form2上实例化'frm'时,您不是通过创建Form1类型的新实例来引用现有表单。(然后您不会“.show()”)

假设你正在从form1启动form2,看起来像这样:

protected void launchForm2()
      {
         Form2 form2 = new Form2();
         form2.Show();
      }

// you need to change that to look like this:

protected void launchForm2()
      {
         Form2 form2 = new Form2();
         form2.Parent = this;
         form2.Show();
      }

然后在form2中你需要像这样解决“父”:

//added to declare myArray global to the form.
PictureBox[,] MyArray;

// to make it 'global' to the application you will need to create some manner of "globalApplicationContext" and pass references of that around or use a 'baseForm' that holds a reference... there are (of course) other solutions as well to globalizing it..

      protected void updateArray()
      {
        string textFromForm1 = ((Form1)this.Parent).textBox1.Text;
// remarked out after @Justin's comment...thx.        
//PictureBox[,] MyArray = new PictureBox[Convert.ToInt32(textFromForm1), Convert.ToInt32(textFromForm1)];

MyArray = new PictureBox[Convert.ToInt32(textFromForm1), Convert.ToInt32(textFromForm1)];
      }

这将保持您的参考顺序......

答案 2 :(得分:0)

其他人指出了解决方案,所以这只是一个后续行动。表单之间的通信很快就会变得非常混乱。无论如何,你在表格上放置了太多的逻辑。业务逻辑应该与GUI分开。查看模型 - 视图 - 控制器模式。