【问题标题】:Databinding updates variables on Parent form数据绑定更新父表单上的变量
【发布时间】:2016-01-14 15:36:21
【问题描述】:

我希望能够将对象列表传递给子窗体,将其绑定到某些控件,从这些控件编辑列表的属性,然后仅在用户单击时将此修改后的列表传递回父窗体好的。如果用户转义或单击取消,那么我不希望更新原始列表。

好的,所以我从父母那里打开一个子表单,将列表传递给该表单:

List<Names> nameList = new List<Names>();
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
    using (Form2 fm2 = new Form2(nameList))
    {
        fm2.ShowDialog();
        if (fm2.NameListProperty != null)
        {
            nameList = fm2.NameListProperty;
        }            
    }
}

在我的子表单Form2 上,我将列表绑定到 ListBox 和 TextBox:

List<Names> nameList = new List<Names>();

public List<Names> NameListProperty { get; set; }

public Form2(List<Names> nameListPassed)
{
    InitializeComponent();

    nameList = nameListPassed;

    BindingSource bs = new BindingSource();
    bs.DataSource = nameList;
    listBoxNames.DataSource = bs;
    listBoxNames.DisplayMember = "FullName";                
    txtSurname.DataBindings.Add("Text", bs, "Surname", true, DataSourceUpdateMode.OnPropertyChanged);       
}

最后,当用户点击 OK 按钮时,属性设置为修改后的 nameList。如果用户没有单击“确定”,即转义或单击“取消”,则该属性未设置并保持为 null,不应将其分配回父表单 Form1 上的主名称列表。

private void btnOK_Click(object sender, EventArgs e)
{
    NameListProperty = nameList;
    this.Close();
}

但是,问题是无论用户如何关闭子表单,父表单上的列表都会更新。用于将列表传递回父表单的属性已过时,因为无论如何都会更新父表单上的列表。我想我的问题是如何阻止这种情况发生,以便我可以选择是否将子表单中的更改传递回父表单。

【问题讨论】:

  • 嘿。你有没有试过这个。获取对话结果见链接link
  • 谢谢,我试过了,但没用。我认为这个问题与链接到父表单或其他东西的数据绑定有关。我对数据绑定不是很熟悉,所以我不确定。父表单中的列表会根据子表单中的更新进行更新。

标签: c# winforms data-binding


【解决方案1】:

List&lt;Names&gt;reference typeNames 类也是如此。当您将这样的列表传递给另一个表单时,添加、删除或元素更新都会自动反映,因为它是一个相同的列表/对象实例。

为了实现期望的行为,您需要传递一个克隆列表。请注意,仅使用nameList.ToList() 是不够的,因为它会创建浅拷贝,而您确实需要深拷贝。一种可能的方法是使用这样的东西

var nameListCopy = nameList.Select(n => new Names
{
    Property1 = n.Property1,
    Property2 = n.Property2,
    // ... the rest of the properties
}).ToList();

using (Form2 fm2 = new Form2(nameListCopy))
// ...

如果您的Names 是简单的数据类(不包含可变引用类型属性/字段),您可以使用以下

class Names
{
    // ...
    public Names Clone() { return (Names)this.MemberwiseClone(); }
}

然后

var nameListCopy = nameList.Select(n => n.Clone()).ToList();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-04
    • 2010-10-14
    • 1970-01-01
    • 2015-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多