2016-01-14 3 views
0

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

ОК, так что я открываю форму ребенка от моего родителя из, как передать список в той форме, как так:

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);  
} 

Затем, наконец, когда пользователь нажимает кнопку «ОК», свойство имеет значение измененного имени. Если пользователь не нажимает «ОК», то есть удаляет или щелкает «Отмена», свойство не устанавливается и остается как null и не должно быть назначено обратно мастеру nameList в родительской форме Form1.

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

Однако, проблема заключается в том, что список на родительской форме не обновляется, независимо от того, как пользователь закрывает форму ребенка. Свойство, которое используется для передачи списка обратно в родительскую форму, устарело, так как список в родительской форме обновляется в любом случае. Я думаю, мой вопрос заключается в том, как остановить это, чтобы я мог выбрать, будут ли изменения в дочерней форме переданы обратно в родительскую форму.

+0

Эй. Вы пробовали это. См. Ссылку [link] (https://support.microsoft.com/en-us/kb/816145) для получения результата диалогового окна –

+0

Спасибо, я пробовал это, но это не сработало. Я думаю, что проблема связана с привязкой привязки данных к родительской форме или чем-то еще. Я не очень хорошо знаком с привязкой данных, поэтому я не уверен. Список в родительской форме обновляется в соответствии с обновлениями в дочернем элементе. – mike7mike

ответ

2

List<Names> - reference type, также класс Names. Когда вы передаете такой список в другую форму, оба дополнения, удаления или обновления элементов автоматически отражаются, потому что это один и тот же экземпляр списка/объекта.

Для того, чтобы достичь желаемого, вам нужно пройти clone. Обратите внимание, что просто использование 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(); 
Смежные вопросы