LINQ-to-XML to DataGridView: невозможно редактировать поля - как это исправить? - PullRequest
5 голосов
/ 29 апреля 2010

В настоящее время я выполняю LINQ-to-XML и заполняю DataGridView моим запросом. Проблема, с которой я сталкиваюсь, заключается в том, что после загрузки в DataGridView значения отображаются как недоступные для редактирования (ReadOnly). Вот мой код:

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

dataGridView1.DataSource = barcodes.ToList();

Я где-то читал, что «DataGridView будет в режиме ReadOnly, когда вы используете анонимные типы». Но я не смог найти объяснения, почему или что именно с этим делать.

Есть идеи?

РЕДАКТИРОВАТЬ - Вот ответ, который я придумал ...

Таким образом, я добавил класс «Контейнер» (с Get и Set <- очень важно!), Чтобы избежать появления анонимных типов в ReadOnly: </p>

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

и изменил оператор LINQ на:

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

И это все! Спасибо за помощь, Гленн!

Ответы [ 2 ]

5 голосов
/ 29 апреля 2010

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

Единственное известное мне решение - создать контейнер для данных, которые можно редактировать. Класс со свойствами, определяющими get и set, даст вам то, что вам нужно.

0 голосов
/ 29 апреля 2010

Вероятно, это связано с ограничением в C # 3 - вы не можете использовать анонимные типы в качестве типов возврата из методов. См. Например this

...