C# 阵列有什么问题吗
我试图在c中将字符串数组从一种形式传递到另一种形式# 我已经尝试过表单1中的代码:C# 阵列有什么问题吗,c#,C#,我试图在c中将字符串数组从一种形式传递到另一种形式# 我已经尝试过表单1中的代码: Form f2 = new Form2(Val); f2.Show(); 以下是第二种形式的代码: public partial class Form2 : Form { public Form2() { InitializeComponent(); } private string[] _vals; public Form2(string[] va
Form f2 = new Form2(Val);
f2.Show();
以下是第二种形式的代码:
public partial class Form2 : Form
{
public Form2()
{
InitializeComponent();
}
private string[] _vals;
public Form2(string[] vals)
{
_vals = vals;
Form Form2 = new Form2();
Form2.Show();
}
private void Form2_Load(object sender, EventArgs e)
{
String BoxText="";
for (int i = 1; i < 11; ++i)
{
BoxText = BoxText + _vals[i];
}
MessageBox.Show(BoxText);
}
}
公共部分类表单2:表单
{
公共表格2()
{
初始化组件();
}
私有字符串[]\u vals;
公共表单2(字符串[]VAL)
{
_VAL=VAL;
Form Form2=新Form2();
表2.Show();
}
私有void Form2_加载(对象发送方、事件参数e)
{
字符串BoxText=“”;
对于(int i=1;i<11;++i)
{
BoxText=BoxText+_vals[i];
}
MessageBox.Show(BoxText);
}
}
代码的最后一部分只是检查是否实际传递了值。但它说我需要对实例进行某种对象引用。
如果我只想将字符串数组传递到下一个表单,那么我做错了什么。去掉这些行:
Form Form2 = new Form2();
Form2.Show();
在构造函数中。当您在Form1
中执行这两行时,您正在加载Form2
的一个实例,但在构建Form2
时,您不希望创建并加载另一个Form2
的实例
澄清一下,问题是正在创建的Form2
的第二个实例正在抛出异常,因为在第一个实例的构造函数中,您正在使用默认构造函数构建第二个实例
public Form2(string[] vals)
{
_vals = vals;
Form Form2 = new Form2();
Form2.Show();
}
如注释中所述,文本框为空的原因是您实际上没有将BoxText
,string
,分配给表单上文本框的text
属性
如许多其他答案所述,您需要调用InitializeComponent()代码>作为第二个构造函数的第一行
public Form2(string[] vals)
{
_vals = vals;
Form Form2 = new Form2();
Form2.Show();
}
您试图仅从其构造函数显示表单,不应该这样做
相反,您可以初始化
public Form2(string[] vals)
{
InitializeComponent();
_vals = vals;
}
这将有助于您的自定义ctor:
public Form2(string[] vals)
{
InitializeComponent();
_vals = vals;
}
您(主要)经历的是缺少表单初始化(initializecomponent),然后使用默认的未初始化数组的构造函数调用form2。form2有两个构造函数
(一)
(二)
首先,您使用string[]
参数newform2(Vals)
调用constructor,然后在第二个构造函数中再次创建Form2
新实例并调用Show()
方法,因此,在Show()
方法调用中,Form2\u Load
事件处理程序被调用,\u vals
此时为NULL
,这就是为什么它会发送一个未设置为的错误对象引用和对象实例
我建议您从第二个构造函数中删除新的Form2对象创建,像这样定义构造函数并删除第一个构造函数
public Form2(string[] vals)
{
InitializeComponent();
_vals = vals;
}
最终代码应该是这样的
Form f2 = new Form2(Val);
f2.Show();
public partial class Form2 : Form
{
private string[] _vals;
public Form2(string[] vals)
{
InitializeComponent();
_vals = vals;
}
private void Form2_Load(object sender, EventArgs e)
{
String BoxText="";
for (int i = 1; i < 11; ++i)
{
BoxText = BoxText + _vals[i];
}
MessageBox.Show(BoxText);
}
}
表格f2=新表格2(Val);
f2.Show();
公共部分类表单2:表单
{
私有字符串[]\u vals;
公共表单2(字符串[]VAL)
{
初始化组件();
_VAL=VAL;
}
私有void Form2_加载(对象发送方、事件参数e)
{
字符串BoxText=“”;
对于(int i=1;i<11;++i)
{
BoxText=BoxText+_vals[i];
}
MessageBox.Show(BoxText);
}
}
或者你可以这样做,
Form f2 = new Form2(Val);
f2.Show();
public partial class Form2 : Form
{
private Form2()
{
InitializeComponent();
}
private string[] _vals;
public Form2(string[] vals): this()
{
_vals = vals;
}
private void Form2_Load(object sender, EventArgs e)
{
String BoxText="";
for (int i = 1; i < 11; ++i)
{
BoxText = BoxText + _vals[i];
}
MessageBox.Show(BoxText);
}
}
表格f2=新表格2(Val);
f2.Show();
公共部分类表单2:表单
{
私人表格2()
{
初始化组件();
}
私有字符串[]\u vals;
public Form2(字符串[]VAL):this()
{
_VAL=VAL;
}
私有void Form2_加载(对象发送方、事件参数e)
{
字符串BoxText=“”;
对于(int i=1;i<11;++i)
{
BoxText=BoxText+_vals[i];
}
MessageBox.Show(BoxText);
}
}
此处:this()
此语法允许您从同一类中的另一个构造函数调用一个构造函数。因此,没有参数constructor的Form2()
将首先调用,然后Form2(string[]vals)
constructor将调用。为什么要在Form2
构造函数中创建另一个Form2
实例?这是什么?为什么从第二个循环调用默认的ctor?另外,在for
循环中,您可能超出了数组边界。您已将9个值硬编码到循环中,因此如果\u vals
的值小于9,您将抛出异常。我通常会为(inti=0;I<\u vals.Length;I++)
做。我认为没有必要投反对票,因为他显然是C#新手,需要帮助理解它。每个人都需要在某个地方学习。虽然这些可能是错误的,但这似乎并不是造成他当前问题的原因。@Servy它很可能是他当前的问题。他的例外可能是第二次被踩到form@Servy,在加载第二个Form2
实例时,\u vals
将由于默认构造函数而为null
。这导致抛出错误。好的,当我尝试将字符串数组添加到richtextbox时,它显示一个空白表单。文本框根本不显示。这让我觉得,也许它没有加载到加载event@MichaelPerrenoud这应该在答案中,因为这是一个关键点。虽然你可能已经证明你理解问题所在,但是OP必须理解答案。你应该进一步解释这并不能解释你改变了什么,为什么它很重要,或者它是如何导致他看到的问题的。仅仅是一个代码转储对于这样的问题是不够的。@Servy,你是对的,我希望我的小(很少)解释有点正确,谢谢:)
Form f2 = new Form2(Val);
f2.Show();
public partial class Form2 : Form
{
private Form2()
{
InitializeComponent();
}
private string[] _vals;
public Form2(string[] vals): this()
{
_vals = vals;
}
private void Form2_Load(object sender, EventArgs e)
{
String BoxText="";
for (int i = 1; i < 11; ++i)
{
BoxText = BoxText + _vals[i];
}
MessageBox.Show(BoxText);
}
}