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

时间:2017-11-27 18:05:09

标签: c# .net winforms listbox

作为标题,我知道很多人都会问这类问题。我已经阅读了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表单)

1 个答案:

答案 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;
    }

}

最好给listBoxItemsotherListboxItems更具体和描述性的名称,但是您没有提供有关列表框含义的信息。 listBox1listBox2无法就列表框中的内容或用户界面中的服务目的进行任何通信。这是一个非常糟糕的编程习惯。一年后,如果你回来修复这段代码,你将不会一眼就知道这是做什么的:

listBox2.Items.AddRange(items);
listBox3.Items.AddRange(otherItems);

然而,这实际上告诉你一些事情:

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

可能是它的汽车或动物或邮政编码而不是食谱。同样的原则适用。将itemsotherItems混为一谈很容易。混淆recipesingredients要困难得多。