2014-01-07 4 views
1

У меня возникли трудности с правильной обработкой привязки моего сложного объекта. У меня есть 3 DataGridViews для формы и 1 источник привязки. BindingSource.DataSource является объектом FileMoveProcesses и DataMember является объектом FileMoveProcessВставка новых строк в DataGridView при привязке к BindingSource

public class FileMoveProcesses 
{ 
    public List<FileMoveProcess> Processes { get; set; } 
} 

public class FileMoveProcess 
{ 
    public string Name { get; set; } 
    public bool Disabled { get; set; } 
    public FileMoveProcessDetails SourceDetails { get; set; } 
    public FileMoveProcessDetails DestinationDetails { get; set; } 
} 

Есть 2 других DataGridViews, которые имеют DataSource из BindingSource и DataMembers являются SourceDetails и DestinationDetails соответственно. Эта работа прекрасна, если у меня есть данные, уже имеющиеся в XML-файле для этих подробных элементов, как вы можете видеть ниже. Процесс редактирования работает просто отлично, обновления сериализуются так, как вы ожидали.

Here is a pic with data loading and editable

Проблема возникает, когда я пытаюсь добавить новый FileMoveProcess. Крайний левый DataGridView, содержащий FileMoveProcess, сохранит правильно, но когда я пытаюсь добавить данные SourceDetails и DestinationDetails в datagridview, они не могут создать объекты FileMoveProcessDetails для нового FileMoveProcess, поэтому он не может быть записан в XML-файл.

Data Failed to be added to the binding source

Что я пропустил?

ТИА

PS в ComboBoxes являются Enum привязки данных, поэтому данные доступны для нового элемента.

+0

так что происходит, когда вы заполняете свои сетки деталей и нажмите save? когда вы отлаживаете, вы можете видеть ваши объекты FileMoveProcessDetails', прикрепленные к текущему 'FileMoveProcess', или они являются нулевыми? – Vland

+0

, когда сетка источника или места назначения теряет фокус, все введенные данные очищаются. – Tim

+0

Обновление. Я зашел в раздел DataBinding/Advanced свойств данных datagrid и сбросил для раскрывающегося списка привязки значение «none». Это очистило проблему очистки сетки, потеряв фокус. Теперь, когда я нажимаю save, объекты объектов имеют значение null. – Tim

ответ

2

Я думаю, вы должны добавить свой новый объект в bindingSource самостоятельно. Я создал простую версию вашего проекта с двумя DGV. Я также установить режим источника данных, обновления для «Никогда» в моем dataGridView2 -> DataBindings -> Advanced

Когда я пишу новый FileMoveProcessDetails (в правой сетке) Я могу сохранить его, нажав на кнопку и вызывая этот код:

private void button1_Click(object sender, EventArgs e) 
{ 
    var myCurrentRow = dataGridView2.Rows[dataGridView2.CurrentRow.Index]; 
    var fmpd = myCurrentRow.DataBoundItem; 
    var pp = (FileMoveProcess)processesBindingSource.Current; 
    pp.SourceDetails = (FileMoveProcessDetails)fmpd; 
} 

Это очень сырой ... но BindingSource сохраняется, и я не теряю свой новый FileMoveProcessDetails, когда я перехожу к другим FileMoveProcess и обратно.

+0

Спасибо Vland. Это сделал трюк. Я предположил, что BindingSource позаботился об этом. – Tim

1

Я воспользовался той же проблемой и решил, что все, что вам нужно сделать, - создать новый экземпляр коллекции List в конструкторе по умолчанию. :)

public class FileMoveProcesses 
{ 
    public FileMoveProcesses() 
    { 
     Processes = new List<FileMoveProcess>(); 
    } 

    public List<FileMoveProcess> Processes { get; set; } 
} 

public class FileMoveProcess 
{ 
    public string Name { get; set; } 
    public bool Disabled { get; set; } 
    public FileMoveProcessDetails SourceDetails { get; set; } 
    public FileMoveProcessDetails DestinationDetails { get; set; } 
} 
+0

Идём для вас +1. Это то, что я пропустил раньше и помог бы. Спасибо за сообщение. – Tim

Смежные вопросы