我正在尝试创建一个全局二维数组,其大小取决于在另一个表单文本框中输入的两个值。但是,我收到一个错误,指出这些值不是静态的。
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将具有一个数组,其大小由用户输入的值确定。此数组将用于处理网格,该网格也由用户输入的值确定。
绕过非静态错误并使用这些值创建数组有什么方法?
答案 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分开。查看模型 - 视图 - 控制器模式。