Использовать несколько источников данных для одного и того же вида данных - PullRequest
0 голосов
/ 02 июля 2018

У меня есть форма, которая содержит две кнопки, представляющие семейства, кнопку копирования, кнопку вставки и просмотр таблицы данных. DatagridView получает список объектов членов семейства в качестве источника данных, нажав кнопку Family. Моя проблема заключается в следующем: После копирования и вставки данных из семейства в другое семейство, если я редактирую ячейку из сетки данных семейства, изменения автоматически применяются к тому же объекту другого семейства. Я не понимаю, почему и что я делаю неправильно.

Может ли кто-нибудь мне помочь?

Вот мой код:

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 голосов
/ 03 июля 2018

Звучит так, будто вы просто скопировали ссылку, а не значение. Вы должны клонировать объект в другой список. Самое простое решение, которое я использую, - это сериализовать / десериализовать его в 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);
}

Когда вы помещаете свой клонированный объект в Список и редактируете его, вы должны редактировать этот объект, а не тот, который находится в списке источников.

0 голосов
/ 06 июля 2018

Спасибо за этот совет. Это помогло мне решить проблему. Я просто сделал класс 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;
    }
}
0 голосов
/ 02 июля 2018

Попробуйте вместо этого создать новый список:

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