【问题标题】:Use multiple datasources for the same datagridview对同一个 datagridview 使用多个数据源
【发布时间】:2018-12-10 10:10:54
【问题描述】:

我有一个表单,其中包含两个代表系列的按钮、一个复制按钮、一个粘贴按钮和一个数据网格视图。 datagridView 通过单击家庭按钮接收家庭成员的对象列表作为数据源。 我的问题是这样的: 在将数据从一个族复制并粘贴到另一个族后,如果我从一个族的 datagridview 编辑一个单元格,则更改会自动应用于另一个族的同一对象。我不明白为什么以及我做错了什么。

有人可以帮我吗?

这是我的代码:

private void BtnCopy_Click(object sender, EventArgs e)
    {
        List<Familymember> selectedFamilyMemberList = ((BindingList<Familymember>)dgvFamilyMember.DataSource).ToList();

        if (selectedFamilyMemberList != null && selectedFamilyMemberList .Count > 0)
        {
            CopiedFamilyMemberList.AddRange(selectedFamilyMemberList);
            btnPaste.Enabled = true;
        }
    }

private void BtnPaste_Click(object sender, EventArgs e)
    {
        ID_FamilyPasteTo = seletedFamily.ID;

        Family[FamilyList.Find(x => x.ID == ID_FamilyPasteTo)].Clear();

        if (CopiedFamilyMemberList.Count > 0 && ID_FamilyCopyFrom != ID_FamilyPasteTo )
        {
            Family[seletedFamily].AddRange(CopiedFamilyMemberList);

            dgvDosingPart.DataSource = null;
            dgvDosingPart.AutoGenerateColumns = false;

            dgvDosingPart.DataSource = new BindingList<FamilyMember>(Family[seletedFamily]);

            dgvDosingPart.Refresh();

            btnPaste.Enabled = false;
        }

        CopiedFamilyMemberList.Clear();
    }

【问题讨论】:

  • 你能添加Family声明吗?
  • private Dictionary&lt;FamilyDescription, List&lt;FamilyMember&gt;&gt; Family = new Dictionary&lt;Family, List&lt;FamilyMember&gt;&gt;();

标签: c# data-binding datagridview binding datasource


【解决方案1】:

感谢这个提示。它帮助我解决了这个问题。 我刚刚使 FamilyMember 类可克隆,向其中添加了方法 Clone() 并再次实现了 BtnCopy_Click 事件。

 public class FamilyMember: ICloneable
{
    public string Name { get; set; }

    ...

    public virtual object Clone()
    {
        return (FamilyMember) this.MemberwiseClone();
    }
}

private void BtnCopy_Click(object sender, EventArgs e)
{
    List<Familymember> selectedFamilyMemberList = ((BindingList<Familymember>)dgvFamilyMember.DataSource).ToList();

    if (selectedFamilyMemberList != null && selectedFamilyMemberList .Count > 0)
    {

        foreach (FamilyMember item in selectedFamilyMemberList)
        {
            CopiedFamilyMemberList.Add((FamilyMember)item.Clone());
        }

        btnPaste.Enabled = true;
    }
}

【讨论】:

    【解决方案2】:

    听起来你只是复制参考而不是价值。您必须将对象克隆到另一个列表。我使用的最简单的解决方案是将其序列化/反序列化为 json 或 XML,并在列表中拥有一个带有新引用的全新对象。

    public T Clone(T obj)
    {
     JsonSerializerSettings jss = new JsonSerializerSettings {
      ReferenceLoopHandling = ReferenceLoopHandling.Ignore,
      Formatting = Formatting.Indented
     };
    
     var json = JsonConvert.SerializeObject(obj, jss);
     return JsonConvert.DeserializeObject<T>(json);
    }
    

    当您将克隆的对象放入列表并对其进行编辑时,您应该编辑此对象,而不是源列表中的对象。

    【讨论】:

      【解决方案3】:

      尝试创建一个新列表:

      List<Familymember> selectedFamilyMemberList = new List<Familymember>(((BindingList<Familymember>)dgvFamilyMember.DataSource).ToList());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-12
        • 1970-01-01
        • 2011-01-02
        • 1970-01-01
        • 2017-02-28
        • 1970-01-01
        • 1970-01-01
        • 2017-02-07
        相关资源
        最近更新 更多