Form2中的值未在Form2中更新

本文关键字:Form2 更新 | 更新日期: 2023-09-27 18:29:57

我在C#桌面应用程序中有两个表单。表格1和表格2。

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

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

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

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

当我运行这个时,什么也没发生。没有错误什么都没有。它只是不向ListBox中添加任何项。

我做错了什么?

Form2中的值未在Form2中更新

您正在创建Form1的一个实例并将一个项添加到它的列表框中,而不是获得一个毫无疑问已经拥有的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);
};

这种方法确保每个表单对彼此的表单了解尽可能少。它减少了两个类之间的耦合,并使表单的未来用户/读者更清楚地了解它们之间到底发生了什么交流。

Form1 frm = new Form1();

这一行正在创建Form2的一个全新实例……与屏幕上已经显示的实例不同。因此,您正在将从未显示在屏幕上的辅助实例添加到列表框中。

如果您使用frm遵循该代码。显示()你会看到的。我想这不是你想要的。

你处理is问题的方法有点天真。

您可以向form2添加一个属性,并将其设置为要使用的Form1 instnace。(PS表格1和表格2没有帮助,请给它们适当的名称。MainForm和DetailForm之类的)。

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

有很多方法可以做到这一点,一个是一个单独的类来保存列表(一个接口和一个类会更好)。然后将属性添加到具有ihneterface或类类型的Form1和Form2中。

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

一旦你有了polace的基础设施,你就可以用它做各种各样的事情,而你使用的方法是大量的代码,为了很少的回报而乱搞。