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

本文关键字:列表 添加 删除项目 | 更新日期: 2023-09-27 18:12:48

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

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

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

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

"然而c#不能做指针(正确吗?)所以我怎么能从我的第二个形式影响这些列表的主要形式的副本?"

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

我不知道为什么你对listOfFruits的改变在你的第一个表单中没有出现。我会检查以下内容:

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

  2. 第一个Form有办法发现,名单已经改变了吗?可能使用具有重复检查的计时器,或者(我最喜欢的)在您更改某些内容时触发event,并在第一个Form中订阅EventHandlerevent

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

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

使用公共字段,尝试使用property,并在创建新的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();