【问题标题】:Value from Form2 not updating in Form2Form2 中的值未在 Form2 中更新
【发布时间】:2012-04-03 16:37:20
【问题描述】:

我在 C# 桌面应用程序中有 2 个表单。表格 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 中。

我做错了什么?

【问题讨论】:

  • 听起来您正在创建 Form1 的新实例,而不是在 GUI 中引用现有实例。您能否发布更多显示/使用 Form1 和 Form2 的 GUI 层代码?
  • 您的项目中有两种类型。但是您正在为每种类型创建多个 object。添加 frm.Show() 以查看您的错误。
  • 你是如何创建你的两个表单的?它们都是由像 MDI 这样的第三种表单创建的,还是 Form1 创建 Form2,或者如何创建?这将帮助我们解答如何让您的两个表单相互交流。

标签: c# winforms listbox


【解决方案1】:

您正在创建 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);
};

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

【讨论】:

  • 我收到错误“无法在此范围内声明名为'sender'的局部变量,因为它会给出不同的含义......”在这一行“otherForm.ButtonClick +=(发件人, args) =>"
  • @Ali 只需在两种情况之一中调用“发件人”即可。我这里没用过,所以没啥可更新的。
  • @Ali 请记住,这并不意味着要逐字逐句,它应该是一个高级别的样子。至少,大多数变量名称应更改为它们实际表示的名称。这种通用模式可以用于解决不同类型的动作/事件的各种问题。
【解决方案2】:

Form1 frm = new Form1();

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

【讨论】:

    【解决方案3】:

    如果您使用 frm.Show() 跟随该代码,您就会看到它。怀疑这不是你想要的。

    您解决问题的方法有点幼稚。

    您可以向 form2 添加一个属性并将其设置为您要使用的 Form1 实例。 (PS form1 和 form2 没有帮助,给它们命名。MainForm 和 DetailForm 之类的)。

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2021-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多