如何从不同的表单中添加/删除列表中的项目?

时间:2016-10-12 13:21:02

标签: c# forms winforms list accessor

假设我的主表单中有一个名为listOfFruits的列表。在第二种形式中,我希望用户能够将该列表中的项目移除到名为removedFruits的第二个列表中。目前我知道我可以在第二种形式中访问这些列表,只需将它们作为参数传递给表单构造函数。但是c#不能做指针(正确?)所以如何从我的第二个表单中影响主表单的这些列表的副本?因为目前我的第二个表单中对这些列表的任何更改都不会影响主表单的列表原始副本。如果我要从传递给我的第二个表单的listOfFruits中删除5个水果,那么在完成我的工作后,主表单仍然会有一个完整的listOfFruits和一个空的removedFruits。有一个简单的解决方案吗?也许是获取/设置或从第二种形式添加/删除原始列表中的项目的方法?也许答案是在某些访问者的东西?

编辑:澄清;我想添加到一个列表,并从另一个列表中删除。不添加/删除到同一列表。不确定这是否完全重要,但我认为如果有的话,我会在这里具体说明。

EDIT2:我认为问题是我正在从第一个表单复制原始列表而不是直接编辑它。有人可以修复我的代码,这样我就可以从我的第二个表单访问原始列表,而不是复制列表吗?

public partial class ListSelector : Form
    {
        private string windowName = Form1.typeOfModuleAdded;
        public List<IOModule> innerIOList;
        IOModule cardAdded = null;

        public ListSelector(List<IOModule> cardList)
        {
            this.Text = windowName;
            innerIOList = cardList;
            InitializeComponent();
            InitializeList();
        }
    private void InitializeList()
    {
        if (windowName == "Drive")
        {
            string[] listDrives = { "ACS880", "test" };
            listBox1.Items.AddRange(listDrives);
        }

        else if (windowName == "IOBlock")
        {
            if (!innerIOList.Any())
            {
                MessageBox.Show("No cards loaded! Please import cards from IO List.", "Error Empty Data", MessageBoxButtons.OK, MessageBoxIcon.Error);
                this.Close();
            }
            foreach (IOModule card in innerIOList)
            {
                cardAdded = card;
                listBox1.Items.Add(card.name);
            }
        }
        else if (windowName == "Local Card")
        {
            string[] listLocals = { "1756-EN2T", "test" };
            listBox1.Items.AddRange(listLocals);
        }
        else if (windowName == "Processor")
        {
            string[] listProcessors = { "1756-L71S", "test" };
            listBox1.Items.AddRange(listProcessors);
        }
    }

    private void addBtn_Click(object sender, EventArgs e)
    {
        if (listBox1.SelectedItem != null)
        {
            Form1.SetModule(listBox1.SelectedItem.ToString());
            Form1.confirmedAdd = true; 
            this.Close();
        }
        else if (cardAdded != null)
        {
            innerIOList.Remove(cardAdded);
        }
        else
        {
            MessageBox.Show("No module selected!");
        }
    }

以下是我从第一张表单中将列表传递给该表单的方法:

        ListSelector test = new ListSelector(ioList);
        test.ShowDialog();

其中ListSelector是我的第二个表单的名称,ioList是我传递给它的列表。

EDIT3:添加了更多代码

3 个答案:

答案 0 :(得分:1)

我假设您在第二个表单中创建了第二个列表,其中填充了第一个表单列表中的项目。然后第二个列表中的更改不会反映在第一个列表中。您必须使用相同的列表参考。

public Form2(List<Fruit> listOfFruits)
{
    this._listOfFruits = listOfFruits;
}

private List<Fruit> _listOfFruits;

答案 1 :(得分:1)

&#34;但是c#不能做指针(正确?)所以如何从第二种形式影响这些列表的主要表格副本?&#34;

不,不正确。任何对象引用(例如,List<Fruit>)仍然是指向内存中某个位置的指针,如果将相同的List<Fruit>对象传递给两个表单,它们将共享相同的List。 / p>

我不知道为什么您对listOfFruits的更改不会在您的第一张表格中进行。我会检查以下事项:

  1. 您是否100%确定在两个表单中使用相同的List<Fruit>对象。 (如果您创建这样的新列表:new List<Fruit>(listOfFruits)它不是相同的列表)

  2. 第一个Form是否有任何查找方法,列表已更改?可以使用具有定期检查的计时器,或者(我最喜欢的)在您更改内容时触发event,并在第一个EventHandler中订阅Formevent。< / p>

答案 2 :(得分:0)

使用公共字段,尝试使用属性,并在创建新的ListSelector时将列表传递给属性。

public partial class ListSelector : Form
{
    private string windowName = Form1.typeOfModuleAdded;
    private List<IOModule> innerIOList;
    IOModule cardAdded = null;

    public List<IOModule> CardList 
    {
         get 
         {
              return innerIOList; 
         }
         set
         {
              innerIOList = value;
              InitializeList();
         }
    }

    public ListSelector()
    {
        this.Text = windowName;
        InitializeComponent();
    }

创建新的ListSelector对象时

ListSelector ls = new ListSelector();
ls.CardList = your mainform list of IOModule here
ls.ShowDialog();