将多个数据源用于同一个datagridview

时间:2018-07-02 08:22:47

标签: c# data-binding datagridview binding datasource

我有一个表单,其中包含两个代表族的按钮,一个复制按钮,一个粘贴按钮和一个datagridview。 通过单击“家庭”按钮,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();
    }

3 个答案:

答案 0 :(得分:0)

尝试创建新列表:

StructType(List(StructField(id,LongType,true),StructField(text,StringType,true),StructField(label,DoubleType,false)))

答案 1 :(得分:0)

听起来像您只是复制参考而不是值。您必须将对象克隆到另一个列表。我使用的最简单的解决方案是将其序列化/反序列化为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);
}

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

答案 2 :(得分:0)

提示。它帮助我解决了问题。 我只是使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;
    }
}