C# 将更新列表框传递给其他表单

C# 将更新列表框传递给其他表单,c#,.net,winforms,listbox,C#,.net,Winforms,Listbox,作为标题,我知道很多人问过这样的问题。我读过很多书,我成功地将listbox中的项目传递给了其他表单,但如果listbox添加了许多新项目,我不知道如何进行。 列表框仅在我重新打开表单时更新。这是我的密码。我打开新表单的方式是修改Program.cs,因为列表框是非静态的 第二张表格上的我的代码(表格1) 我意识到我不应该把“listBox2.Items.AddRange”放在公共表单1(…)中,但我不知道如何( (listBox2正在Lm表单中更新,我正在尝试将其传递到Form1表单)什么是

作为标题,我知道很多人问过这样的问题。我读过很多书,我成功地将listbox中的项目传递给了其他表单,但如果listbox添加了许多新项目,我不知道如何进行。 列表框仅在我重新打开表单时更新。这是我的密码。我打开新表单的方式是修改Program.cs,因为列表框是非静态的

第二张表格上的我的代码(表格1)

我意识到我不应该把“listBox2.Items.AddRange”放在公共表单1(…)中,但我不知道如何( (listBox2正在Lm表单中更新,我正在尝试将其传递到Form1表单)

什么是“在公共Form1中”是什么意思?你是说构造函数吗?构造函数实际上是一个很好的初始化场所。事实上,这正是它们被发明的目的。你已经把代码放在了它应该放的地方,但是你可以而且应该改进它的写法

不太好的是将列表框作为参数传递给构造函数,而构造函数需要的只是一个项集合。也许您这次提供的集合恰好属于列表框,但这并不重要。标签文本也是如此:Form1真正需要的是一些文本。它不在乎文本是否来自某个地方的标签。所以让它只要求文本

因此,只需传递以下项目:

public Form1(System.Collections.IEnumerable items, 
             System.Collections.IEnumerable otherItems, 
             String labelText)
{
    InitializeComponent();

    listBox2.Items.AddRange(items);

    //  etc.
}
就这样说吧

static void OnLmChanged(object sender, EventArgs args)
{
    if (!f1.Visible)
    {
        f2 = new Form1(f1.listBox2.Items, f1.listBox3.Items, f1.label7.Text);
        f2.Show();
        f2.FormClosing += OnFormChanged;
    }

}
最好给
listBoxItems
otherListboxItems
提供更具体、更具描述性的名称,但您没有提供有关listBoxItems的含义的信息。
listBox1
listBox2
对listBoxItems中的内容或它们在用户界面中的用途没有任何交流。这就是这是非常糟糕的编程实践。一年后,如果您回来修复此代码,您将无法一眼就知道这是在做什么:

listBox2.Items.AddRange(items);
listBox3.Items.AddRange(otherItems);
然而,这实际上告诉了你一些事情:

recipeListBox.Items.AddRange(recipes);
ingredientListBox.Items.AddRange(ingredients);

可能是汽车、动物或Zipcode而不是食谱。同样的原理也适用。很容易将
项目
其他项目
混为一谈,因为哪些是哪个。混为一谈
食谱
配料

你的列表框中充满了数据集合,传递集合/列表不是列表框本身谢谢你的帮助!我对C有点陌生,所以我完全忘了命名东西:(我正在尝试你的建议,效果还不错。但是当主窗体中的ListBox只有一个项并且该项的值不断更改时,第二个窗体中的ListBox在我重新打开之前不会更新=。=@MinhLee将ListBox本身传递给Form1构造函数不会解决该问题。如果需要通知Form1 Form2中正在进行的更改,则需要一个e。)发泄。我并不急于回答你的新问题,因为如果你的问题已经完全改变了一次,那么每次我尝试回答它时,它可能都会不断改变。你能提供你真正想问的问题的完整、最终版本吗?
listBox2.Items.AddRange(items);
listBox3.Items.AddRange(otherItems);
recipeListBox.Items.AddRange(recipes);
ingredientListBox.Items.AddRange(ingredients);