2010-04-28 27 views
5

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!

Trả lời

5

Lý do chế độ xem lưới dữ liệu ở chế độ Chỉ đọc khi liên kết với các loại ẩn danh là các loại ẩn danh là ReadOnly. Bạn sẽ nhận được hành vi tương tự nếu bạn ràng buộc khung nhìn vào một danh sách các đối tượng chỉ với các thuộc tính chỉ đọc.

Giải pháp duy nhất mà tôi biết là tạo vùng chứa cho dữ liệu có thể chỉnh sửa được. Một lớp với các thuộc tính định nghĩa một get và set sẽ cung cấp cho bạn những gì bạn đang có.

+0

@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

0

Có thể do giới hạn trong C# 3 - bạn không thể sử dụng các loại ẩn danh làm kiểu trả về từ các phương thức. Xem ví dụ this

Các vấn đề liên quan