Вопрос по привязке данных: DataGridView <=> XDocument (с использованием LINQ-to-XML) - PullRequest
1 голос
/ 29 апреля 2010

Обучение LINQ до сих пор было очень увлекательным, но, несмотря на чтение нескольких книг и кучу онлайн-ресурсов по этой теме, я все еще чувствую себя в целом n00b. Недавно я только что узнал, что если мой запрос возвращает анонимный тип, заполненный DataGridView будет ReadOnly (потому что, по-видимому, анонимными типами являются ReadOnly.)

Сейчас я пытаюсь найти самый простой способ:

  1. Получить подмножество данных из файла XML в DataGridView,
  2. Разрешить пользователю редактировать указанные данные,
  3. Вставьте измененные данные обратно в файл XML.

Пока у меня есть шаги 1 и 2:

public class Container
{
    public string Id { get; set; }
    public string Barcode { get; set; }
    public float Quantity { get; set; }
}

// For use with the Distinct() operator
public class ContainerComparer : IEqualityComparer<Container>
{
    public bool Equals(Container x, Container y)
    {
        return x.Id == y.Id;
    }

    public int GetHashCode(Container obj)
    {
        return obj.Id.GetHashCode();
    }
}

var barcodes = (from src in xmldoc.Descendants("Container")
        where src.Descendants().Count() > 0
        select
        new Container
        {
           Id = (string)src.Element("Id"),
           Barcode = (string)src.Element("Barcode"),
           Quantity = float.Parse((string)src.Element("Quantity").Attribute("value"))
        }).Distinct(new ContainerComparer());

dataGridView1.DataSource = barcodes.ToList();

Это прекрасно работает при получении нужных мне данных из XML в DataGridView, так что у пользователя есть способ манипулировать значениями.

После выполнения пошаговой трассировки моего кода я обнаружил, что изменения значений, сделанные в DataGridView, не привязаны к объекту XDocument и, как таковые, не распространяются обратно.

Как мы позаботимся о Шаге 3? (получение данных обратно в XML) Возможно ли привязать XML напрямую к DataGridView? Или мне нужно написать еще одну инструкцию LINQ для получения данных из DGV обратно в XDocument?

Suggstions

1 Ответ

1 голос
/ 30 апреля 2010

Итак, я думаю, что проблема у вас заключается в том, что нет никакой связи между объектами, к которым вы привязываетесь, и исходным документом XML.

То, что вы делаете, - это создание кучи объектов, добавление некоторых строк и плавающего элемента, а затем привязка вида сетки к этому списку объектов. Все объекты знают, что некоторые данные были предоставлены в конструкторе, он не знает, откуда эти данные берутся. Когда вы вызываете «выбрать что-то новое ()», вы создаете новый объект, этот новый объект не знает или не заботится о том, что он был создан с использованием LINQ to XML ...

Самый простой способ решить это - изменить установщик свойств вашего контейнера, чтобы они загружали XML, изменили элемент, который они должны представлять, а затем снова сохранили xml. Возможно, если указать контейнеру ссылку на элемент или документ, это будет проще.

Другим способом было бы подключиться к событиям вида сетки, чтобы при редактировании строк можно было зафиксировать изменения и записать их в файл XML.

...