Я в настоящее время делаю 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!
Причина, по которой представление сетки данных находится в режиме ReadOnly при привязке к анонимным типам, заключается в том, что анонимные типы являются ReadOnly. Вы получите такое же поведение, если привяжете представление к списку объектов со свойствами, доступными только для чтения.
Единственное известное мне решение - создать контейнер для редактируемых данных. Класс со свойствами, определяющими get и set, даст вам то, что вы ищете.
Возможно, это связано с ограничением в C# 3 - вы не можете использовать анонимные типы в качестве возвращаемых типов из методов. Смотрите, например, this