【问题标题】:Passing updating listbox to other form将更新列表框传递给其他表单
【发布时间】:2017-11-27 18:05:08
【问题描述】:

作为标题,我知道很多人都问过这种问题。我已经阅读了很多,我成功地将列表框中的项目传递给其他表单,但是如果列表框添加了许多新项目,我不知道如何。 列表框仅在我重新打开表单时更新。这是我的代码。我打开新表单的方式是修改 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 表单,我正在尝试将其传递给 Form1 表单)

【问题讨论】:

  • 您的列表框充满了数据集合,传递集合/列表而不是列表框本身

标签: c# .net winforms listbox


【解决方案1】:

“in public 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 要困难得多。

【讨论】:

  • 感谢您的帮助!我是 C# 的新手,所以我完全忘记了命名事物:( 我正在尝试你的建议,它工作正常。但是当主窗体中的 ListBox 只有 1 个项目并且该项目的值不断变化时,列表框在我重新打开它之前,第二种形式不会更新=.=
  • @MinhLee 将列表框本身传递给 Form1 构造函数并不能解决该问题。如果您需要通知 Form1 Form2 正在进行的更改,则需要一个事件。我并不急于尝试回答您的新问题,因为如果您的问题曾经完全改变过,那么每次我尝试回答它时它可能都会不断改变。您能否提供您真正想问的问题的完整最终版本?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-02
  • 2017-04-03
  • 2014-02-13
  • 2012-08-07
  • 1970-01-01
  • 2012-11-08
  • 1970-01-01
相关资源
最近更新 更多