c#winforms数组项被删除

时间:2018-12-04 12:20:49

标签: c# arrays winforms

我知道这看起来很傻,但是我在winforms中遇到了一个奇怪的问题。我有一个Windows应用程序,在完成一组特定的操作后,我想填充一个 Checked ComboBox 。我使用两个类进行此操作。我想将数组从帮助程序类复制到表单类。调用AddArrayItems方法时将复制数组。但是,当我看到窗体中的ComboBox时,它为null。在使用watch变量进行调试之后,我知道问题是将数组复制到Form1数组之后,一旦控件返回到调用者,数组项将被删除。我尝试复制自己的内容,虽然不完全相同,但仍然与我的工作类似。

我的代码如下:

using System;
using System.Windows.Forms;

namespace DemoApp
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }    
        string[] cboxAr;    

        public void AddCmboBoxItems(string[] cbArry)
        {
            cboxAr = new string[cbArry.Length];
            Array.Copy(cbArry, 0, cboxAr, 0, cbArry.Length); 
            //cbArry.CopyTo(cboxAr, 0);
            //foreach (string s in cboxAr)
                //comboBox1.Items.Add(s);
            comboBox1.Show();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            HelperClass.DoSomething();
        }
    }

    public class HelperClass
    {
        public HelperClass()
        {
        }

        public void HelperMethod()
        {
            SomeMethod();
        }

        private void SomeMethod()
        {
            string[] partnrName = new string[5] { "str1", "str2", "str3", "str4", "str5"};

            Form1 f = new Form1();
            f.AddCmboBoxItems(partnrName);
        }

        public static void DoSomething()
        {
            new HelperClass().HelperMethod();
        }
    }
}

我不明白这里到底是什么问题。任何人都可以向正确的方向推动我。预先感谢。

1 个答案:

答案 0 :(得分:1)

您永远不会在修改表单控件后显示该表单:

Form1 f = new Form1();
f.AddCmboBoxItems(partnrName);

但是您是从现有的 表单中调用的:

private void button1_Click(object sender, EventArgs e)
{
    HelperClass.DoSomething();
}

想必您要修改那个表单上的控件?然后,您需要对该表格的引用。将一个传递给方法:

private void button1_Click(object sender, EventArgs e)
{
    HelperClass.DoSomething(this);
}

并在方法定义中接受它:

public static void DoSomething(Form1 form)
{
    new HelperClass().HelperMethod(form);
}

如此,直到需要使用它为止。 (旁注:您在这里发生了很多 奇怪的间接调用,它们似乎是静态方法和实例方法以及类的随机混合。您可以简化很多操作,这将减少代码更改。)< / p>

最终,SomeMethod需要修改表单的实例:

private void SomeMethod(Form1 form)
{
    string[] partnrName = new string[5] { "str1", "str2", "str3", "str4", "str5"};

     form.AddCmboBoxItems(partnrName);
}

为说明整体观点,请考虑一个类比...

一辆汽车从装配线滑下。您打开后备箱,然后将手提箱放进去。片刻之后,另一辆车从同一条装配线滑落。它在各个方面都与第一辆汽车相同。当您打开第二辆汽车的后备箱时,您是否希望在其中找到行李箱?

Form是与其他对象一样的对象。对一个对象的一个​​实例所做的更改不会反映在同一对象的其他实例中。每个实例保持其自己的状态。为了修改特定实例,您需要对该实例的引用。