【问题标题】:Getting the array length from one form class to another form class c#将数组长度从一个表单类获取到另一个表单类c#
【发布时间】:2017-09-03 13:25:01
【问题描述】:

我最初在我的程序(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";
          }                
     }
}

但是当我运行程序时,我在 form2 的 for 循环中收到错误“对象引用未设置为对象的实例”!我该如何纠正这个问题?

【问题讨论】:

  • 您正在 Form2_Load 中创建 Form1 的新实例。该实例与您从中打开 Form2 的实例不同。这就是为什么你会得到这个例外。您需要在打开 Form2 时将 Form1 的当前实例或数组本身发送到 Form2。

标签: c# arrays string forms runtime-error


【解决方案1】:

您似乎正在再次初始化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();
}

【讨论】:

    【解决方案2】:
    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:这只是一种改动很小的方法,我不鼓励过多使用它,因为它在更大的范围内会让人感到困惑。

    【讨论】:

    • thanx 但在 _form = form;我收到一个错误“名称形式在当前上下文中不存在”!
    猜你喜欢
    • 2017-01-24
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 1970-01-01
    • 2020-07-25
    • 2012-02-24
    • 1970-01-01
    相关资源
    最近更新 更多