我在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中。
我做错了什么?
答案 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,你可以用它来做各种各样的事情,而你使用的方法是很多代码而且很少得到奖励。