作为标题,我知道很多人都会问这类问题。我已经阅读了manys,我成功地将列表框中的项目传递给其他形式,但是如果列表框中添加了许多新项目,我不知道如何。 列表框仅在我重新打开表单时更新。这是我的代码。我打开新表单的方法是修改Program.cs,因为列表框是非静态的
.....
static class Program
{
private static Lm f1; //This is my Main form
private static Form1 f2; // This is the second
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
f1 = new Lm();
f1.VisibleChanged += OnLmChanged;
Application.Run(f1);
}
static void OnLmChanged(object sender, EventArgs args)
{
if (!f1.Visible)
{
f2 = new Form1(f1.listBox2, f1.listBox3, f1.label7);
f2.Show();
f2.FormClosing += OnFormChanged;
}
}
static void OnFormChanged(object sender, EventArgs args)
{
f1.Show();
}
我在第二个表单(Form1)上的代码
public partial class Form1 : Form
{
public Form1(ListBox listBox, ListBox list1, Label ll)
{
InitializeComponent();
listBox2.Items.AddRange(listBox.Items);
//listBox.SelectedIndexChanged += (s, args) => //This didn't work
//{
//listBox2.Refresh();
//listBox2.Items.AddRange(listBox.Items);
//};
}
我意识到我不应该将“listBox2.Items.AddRange”放在公共Form1(..)中,但我不知道如何...... :( (listBox2正在以Lm Form形式更新,我正在尝试将其传递给Form1表单)
答案 0 :(得分:0)
公共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
更具体和描述性的名称,但是您没有提供有关列表框含义的信息。 listBox1
和listBox2
无法就列表框中的内容或用户界面中的服务目的进行任何通信。这是一个非常糟糕的编程习惯。一年后,如果你回来修复这段代码,你将不会一眼就知道这是做什么的:
listBox2.Items.AddRange(items);
listBox3.Items.AddRange(otherItems);
然而,这实际上告诉你一些事情:
recipeListBox.Items.AddRange(recipes);
ingredientListBox.Items.AddRange(ingredients);
可能是它的汽车或动物或邮政编码而不是食谱。同样的原则适用。将items
和otherItems
混为一谈很容易。混淆recipes
和ingredients
要困难得多。