C# 阵列有什么问题吗

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

我试图在c中将字符串数组从一种形式传递到另一种形式# 我已经尝试过表单1中的代码:

 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);
    }
}