Вставка новых строк в DataGridView при привязке к BindingSource

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

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-файле для этих элементов данных, как вы можете видеть ниже. Процесс редактирования работает просто отлично, обновления сериализуются, как и следовало ожидать.

Вот картинка с загрузкой данных и возможностью редактирования

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

Не удалось добавить данные в источник привязки

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

ТИА

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


person Tim    schedule 07.01.2014    source источник
comment
так что же происходит, когда вы заполняете сетки деталей и нажимаете «Сохранить»? когда вы отлаживаете, вы можете видеть свои объекты FileMoveProcessDetails, прикрепленные к текущему FileMoveProcess, или они нулевые?   -  person Vland    schedule 07.01.2014
comment
когда сетка Source или Destination Details теряет фокус, все введенные данные очищаются.   -  person Tim    schedule 07.01.2014
comment
Обновлять. Я зашел в раздел DataBinding/Advanced в свойствах сетки данных и сбросил раскрывающийся список привязок до none. Это устранило проблему очистки сетки при потере фокуса. Теперь, когда я нажимаю «Сохранить», объекты сведений становятся нулевыми.   -  person Tim    schedule 07.01.2014
comment
у вас может быть только 1 SourceDetails для FileMoveProcessDetails, верно? (и 1 пункт назначения)   -  person Vland    schedule 07.01.2014


Ответы (2)


Я думаю, вы должны добавить свой новый объект в bindingSource самостоятельно. Я создал простую версию вашего проекта, всего с 2 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 и обратно.

person Vland    schedule 07.01.2014
comment
Спасибо Вланд. Это помогло. Я предполагал, что BindingSource позаботится об этом. - person Tim; 07.01.2014

Я столкнулся с той же проблемой и понял, что все, что вам нужно сделать, это создать новый экземпляр коллекции 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; }
}
person alexqc    schedule 20.07.2014
comment
Собираюсь дать вам +1 за это. Это то, что я пропустил ранее и помогло бы. Спасибо за сообщение. - person Tim; 21.07.2014
comment
Вы спасли мой день! - person MoustafaS; 09.05.2018