我的c#代码有问题。目前,我试图用多个窗口编程Windows窗体应用程序。现在我的问题是:
在第一个窗口,我有一个组合框的一些值。当我点击一个按钮时,第二个窗口打开,它应该可以在第一个表单上向这个组合框添加一个值。
问题是,在第一个窗口中,我有一个LinkedList,其中我的值在。
像这样:
public LinkedList<String> sample = new LinkedList<String>();
hase.AddFirst("test");
combobox.Items.AddRange(sample.ToArray());
现在,在第二个窗口,LinkedList是不可用的,即使我把它公开。解决这个问题的最好方法是什么?
希望你理解我的问题…
哈拉尔德
在不知道如何访问LinkedList的情况下,很难说为什么它不适合你。
让我们看一下你有什么。你有一个LinkedList,它是表单上的一个实例变量。因为这个LinkedList是一个实例变量,所以它与表单的实例相关联。
下面的例子,不工作,因为它试图静态访问它:
public class MyForm : Form
{
public LinkedList<string> _list = new LinkedList<string>();
}
public class MySecondForm : Form
{
public void Window_Loaded(object sender, EventArgs e)
{
MyForm._list.AddFirst("This doesn't work");
//WRONG! list is an instance variable we are trying to access statically.
}
}
所以,我们可以看到这不起作用。我们有几个选择来让它工作。首先,一个很糟糕的解决方案是让list
变成静态的。不要使用这个选项。它为并发问题打开了大门,可能会泄漏强引用等。一般来说,由于这些原因,我不鼓励使用静态(如单例)来传递数据。单例模式有它的时代和位置,但我不认为这是它,因为它很容易被避免。
好了,既然我们已经解决了不好的解决方案,让我们来看看一些可能的好方案。
在MySecondForm
上设置列表。你有几个选择。构造函数、属性或方法。例如:
public class MyForm : Form
{
private LinkedList<string> _list = new LinkedList<string>();
public void Button1_Click(object sender, EventArgs e)
{
var secondForm = new MySecondForm();
secondForm.SetList(_list);
secondForm.ShowDialog();
MessageBox.Show(_list.First.Value);
}
}
public class MySecondForm : Form
{
private LinkedList<string> _list;
public void Window_Loaded(object sender, EventArgs e)
{
this._list.AddFirst("This will work");
}
public void SetList(LinkedList<string> list)
{
_list = list;
}
}
这是一个可能的解决方案。构造函数是Billy建议的另一个可能的解决方案。
因为LinkedList
是一个引用类型,所以在MySecondForm
实例上对它所做的任何更改都会反映在MyForm
的链表上。
您总是可以将它传递给第二个窗口。正如vcsjones在下面指出的那样,只有在重新分配列表时才需要添加ref关键字。您将需要一个以链表为变量的构造函数。
SecondWindow secondWindow = new SecondWindow(sample);
另一种方法是使用单例模式创建一个类,并在其中放置链表。然后,如果它在一个公共位置,您就可以从两个窗口访问它。