LINQ-to-XML к DataGridView: не Может отредактировать поля — Как зафиксировать?

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

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:

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

И вот именно! Спасибо за справку, Glenn!

5
задан Pretzel 29 April 2010 в 14:05
поделиться

2 ответа

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

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

5
ответ дан 14 December 2019 в 19:06
поделиться

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

0
ответ дан 14 December 2019 в 19:06
поделиться
Другие вопросы по тегам:

Похожие вопросы: