Form2中的值未在Form2中更新

时间:2012-04-03 16:37:21

标签: c# winforms listbox

我在C#桌面应用程序中有2个表单。 Form1和Form2。

Form1包含一个公共方法,它在ListBox控件中添加项目,如下所示:

public void AddToList(string item)
{
    listBox.Items.Add(item);
}

当我在某个按钮上直接调用此方法时,它可以正常工作。但是当我从Form2调用此方法时,它不会在Form1上的ListBox控件中添加任何内容。 Form2中的代码如下:

Form1 frm = new Form1();
frm.AddToList("something");

当我跑步时,没有任何事情发生。没有错误。它只是不会将任何项添加到ListBox中。

我做错了什么?

3 个答案:

答案 0 :(得分:2)

您正在创建Form1的 new 实例并向其列表框添加项目,而不是获取您无疑已经拥有的Form1实例并在其上调用该方法。

天真的方法是在Form2构造函数中有一个参数,它接受Form1的一个实例并将其保存为实例变量,以便在此事件处理程序中使用。

从设计的角度来看,我不太喜欢这种方法。

我建议在Form2中创建一个公共事件,让Form1订阅该事件并添加一个处理程序,将该项添加到列表框中。 Form2中的事件看起来像这样:

public event EventHandler ButtonClick
{
    add
    {
        button1.Click += value;
    }
    remove
    {
        button1.Click += value;
    }
}

然后你将拥有一个看起来像这样的属性:

public string SomeValueForm1NeedsOnButtonClick
{
    get
    {
        return texbox1.Text;
    }
}

然后在Form1中你会有类似的东西:

Form2 otherForm = new Form2();
otherForm.ButtonClick += (sender, args) =>
{
    listbox1.Items.Add(otherForm.SomeValueForm1NeedsOnButtonClick);
};

这种方法确保每种形式只能尽可能少地了解彼此的形式。它减少了两个类之间的耦合,使表单的未来用户/读者更清楚地了解它们之间的通信。

答案 1 :(得分:0)

Form1 frm = new Form1();

此行正在创建Form2的全新实例...与屏幕上已显示的实例不同。所以你要添加到这个从未在屏幕上显示的辅助实例的列表框中。

答案 2 :(得分:0)

如果您使用frm.Show()跟踪该代码,您会看到它。因为没有你想要的。

你对问题的解决方法有点天真。

您可以向form2添加属性并将其设置为您要使用的Form1实例。 (PS form1和form2没有帮助,给他们正确的名字.MainForm和DetailForm或其他)。

上面的问题是你实施了一个可怕的依赖。

有很多方法可以解决这个问题,一个是单独的类来保存列表(接口和类会更好)。 然后将属性添加到FormI和Form2 of teh ihneterface或类类型。

然后,Form2可以将内容添加到列表中。 这引发了一个列表更改事件。 Form1与事件处理程序挂钩,然后刷新它用于显示行为的列表框。

一旦你在polace中有了infrasturure,你可以用它来做各种各样的事情,而你使用的方法是很多代码而且很少得到奖励。