У меня есть форма, которая содержит две кнопки, представляющие семейства, кнопку копирования, кнопку вставки и datagridview. 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();
}
private Dictionary<FamilyDescription, List<FamilyMember>> Family = new Dictionary<Family, List<FamilyMember>>();




Вместо этого попробуйте создать новый список:
List<Familymember> selectedFamilyMemberList = new List<Familymember>(((BindingList<Familymember>)dgvFamilyMember.DataSource).ToList());
Похоже, вы просто копируете ссылку, а не значение. Вы должны клонировать объект в другой список. Самое простое решение, которое я использую, - сериализовать / десериализовать его в 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);
}
Когда вы помещаете свой клонированный объект в список и редактируете его, вы должны редактировать этот объект, а не тот, который находится в исходном списке.
Спасибо за этот совет. Это помогло мне решить проблему. Я просто сделал клонируемый класс 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;
}
}
Вы можете добавить декларацию
Family?