В настоящее время я выполняю 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());
И это все! Спасибо за помощь, Гленн!