Tôi hiện đang làm LINQ-to-XML và điền một DataGridView với truy vấn của tôi tốt. Những rắc rối tôi đang chạy vào là một khi được nạp vào DataGridView, các giá trị có vẻ là Un-editable (ReadOnly). Đây là mã của tôi:LINQ-to-XML sang DataGridView: Không thể chỉnh sửa các trường - Cách khắc phục?
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();
Tôi đọc ở đâu đó rằng "DataGridView sẽ ở chế độ Chỉ đọc khi bạn sử dụng các loại Chưa xác định". Nhưng tôi không thể tìm thấy một lời giải thích tại sao hoặc chính xác phải làm gì về nó.
Bất kỳ ý tưởng nào?
EDIT - Dưới đây là câu trả lời tôi đã đưa ra ...
Vì vậy, tôi đã thêm một lớp "container" (với Get và Set < - rất quan trọng) để tránh các loại Anonymous là ReadOnly vấn đề:
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();
}
}
và thay đổi tuyên bố LINQ to:
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());
và đó là nó! Cảm ơn sự giúp đỡ, Glenn!
@Glenn: Cảm ơn. Đó là kinda có ý nghĩa trong đầu của tôi. Mặc dù tha thứ cho tôi vì là một người mới LINQ, nhưng tôi vẫn đang cố gắng che giấu những gì đang diễn ra dưới mui xe. Điều gây nhầm lẫn với tôi là dường như một kiểu ẩn danh sẽ vẫn trả về các tham chiếu tới từng giá trị, như vậy khi giá trị trong một trường của DataGridView bị thay đổi, dữ liệu XML trong XDocument cũng được thay đổi đồng thời. Vì vậy, bạn có nói rằng nếu tôi tạo ra một lớp có thể chứa những giá trị đó, tôi sẽ có thể có được những gì tôi đang tìm kiếm? – Pretzel