如何 add/remove 来自不同形式列表的项目?

How to add/remove items from a list from a different form?

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

编辑:澄清;我想添加到一个列表,并从另一个列表中删除。不是 add/remove 到同一个列表。不确定这是否完全重要,但我想我会在这里具体说明以防万一。

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:添加了更多代码

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

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

private List<Fruit> _listOfFruits;

"However c# can't do pointers (correct?) so how can I effect the main form's copy of these lists from my second form?"

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

我不知道为什么您对 listOfFruits 所做的更改没有出现在您的第一个表格中。我会检查以下内容:

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

  2. 第一个 Form 是否有任何方法可以发现列表已更改?可以使用带有循环检查的计时器,或者(我最喜欢的)在您更改某些内容时触发 event,并将第一个 Form 中的 EventHandler 订阅到 event

而不是使用 public 字段,尝试使用 属性 并在创建新的 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();