我有以下代码,我创建了一个对象,并通过一系列窗体将其传递给用户控件。
public class MyObject
{
public List<AnObject> Objects {get; set;}
}表格1:
private void MyObject _myObject = new MyObject{Objects = new List<AnObject>()};
...
Form2 form2 = new Form2(ref _myObject);
form2.Show();表格2:
public Form2(ref MyObject myObject)
{
UserControl1 myControl = new UserControl1();
myControl.Objects = myObjects.Objects
}UserControl1
public List<AnObject> Objects {get; set;}
...
Objects.Add(new myObject());当我向UserControl1中的对象添加一个新的myObject()时,它不会更新我在Form1上的原始列表。我正在通过引用传递myObject。当我将Form2的AnObject列表赋给UserControl1时,我唯一能想到的就是以某种方式拆开我的值。我做错了什么?
发布于 2010-12-02 05:04:50
List<T>没有关于其更改的通知。因此,当您以一种形式更改其内容时,另一种形式并不知道它。考虑使用ObservableCollection并在控件中订阅其CollectionChanged事件。发布于 2010-12-02 05:01:38
ref甚至不应该是必要的。
当我向UserControl1中的对象添加新的myObject()时,它不会更新我在Form1上的原始列表
它应该做到这一点。最好发布准确的代码,这部分告诉我代码没有被复制/粘贴:
public Form2(ref MyObject myObject)
{
UserControl1 myControl = new UserControl1();
myControl.Objects = myObjects.Objects // extra 's'
}因此,我们现在正在寻找代码中的一个小问题,它是真实内容的不精确副本。无可救药。
发布于 2010-12-02 05:04:07
无论如何,.NET中的对象都是引用类型。在这种情况下,只有当您希望在同一参数中传回不同的对象而不是返回新对象时,才需要使用ref。对于您在这里所做的事情,ref是完全不必要的。(与之形成对比的是,struct是值类型,因此ref做了一些更有可能有用的事情)类似地,由于对象已经是值类型,所以这里没有装箱或取消装箱的概念。
https://stackoverflow.com/questions/4329073
复制相似问题