我最初在我的程序(form1)中声明一个空的公共字符串数组,当单击一个按钮时,datagridview单元格中的字符串被放入数组中!但我发现难以将该数组的长度转换为另一个表单类(form2)
public partial class Form1 : Form
{
public string[] strarray;
public string order;
public Form1()
{
InitializeComponent();
}
public void button2_Click(object sender, EventArgs e)
{
var new1=dataGridView2.Rows[0].Cells[2].Value;
ordernew = new1.ToString();
strarray = ordernew.Split(',');
Form2 f2 = new Form2();
f2.Show();
}
}
使用split函数为数组赋值字符串值成功! 在form2代码如下!
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
Form1 f1 = new Form1();
for (int m = 0; m < f1.strarray.Length; m++)
{
label.Text="Hello";
}
}
}
但是当我运行程序时,我得到了错误&#34;对象引用未设置为对象的实例&#34;在form2的for循环中!我怎么能纠正这个?
答案 0 :(得分:0)
Form1 f1 = new Form1();
这就是导致问题的原因。你创建了一个不使用旧窗口的新窗口,因此新窗口仍然没有一个strarr,最简单的解决方法就是使Form2构造获取Form1参数并保存它在一个领域然后使用它。
public partial class Form2 : Form
{
private Form1 _form;
public Form2(Form1 form)
{
InitializeComponent();
_form = form;
}
private void Form2_Load(object sender, EventArgs e)
{
for (int m = 0; m < _form.strarray.Length; m++)
{
label.Text="Hello";
}
}
}
在Form1的事件处理程序中,您将this
作为参数传递:
Form2 f2 = new Form2(this);
f2.Show();
P.S:这只是改变微乎其微的一种方式,我不鼓励使用它,因为它可能会在更大的范围内引起混淆。
答案 1 :(得分:0)
您似乎正在重新初始化Form1
。
您可以做的是为Form2添加另一个属性,然后在调用Form2
时为其分配值。
在Form2中:
public partial class Form2 : Form
{
public string[] strarray { get; set; } //add this.
public Form2()
{
InitializeComponent();
}
private void Form2_Load(object sender, EventArgs e)
{
//You can also use foreach to avoid out of bound index
foreach(var strItem in strarray)
{
label.Text = "Hello " + strItem;
}
}
}
然后在Form1
public void button2_Click(object sender, EventArgs e)
{
var new1=dataGridView2.Rows[0].Cells[2].Value;
order = new1.ToString();
Form2 f2 = new Form2();
f2.strarry = ordernew.Split(','); //surprise!! I don't know where you get ordernew variable but anyways, assign your values HERE...
f2.Show();
}