2008-09-24 30 views
34

Tôi đang cố gắng ràng buộc một List<T> với một điều khiển DataGridView và tôi không có bất kỳ may mắn nào tạo ra các ràng buộc tùy chỉnh.winForms + DataGridView ràng buộc vào một Danh sách <T>

Tôi đã thử:

gvProgramCode.DataBindings.Add(new Binding("Opcode",code,"Opcode")); 

Nó ném một ngoại lệ, nói rằng không có gì được tìm thấy bởi cái tên bất động sản.

Tên của cột được đề cập là "Opcode". Tên của bất động sản trong List<T> là Opcode.

TRẢ LỜI TRẢ LỜI: vấn đề là tôi không có các trường có thể ràng buộc trong lớp của tôi dưới dạng thuộc tính, chỉ các trường công khai ... Dường như nó không phản ánh trên trường, chỉ thuộc tính.

+0

LOL đó chỉ là những gì tôi đã thêm trong ý kiến ​​của tôi, rất vui vì bạn đã có vấn đề của bạn được giải quyết. –

+2

+1 Tôi vừa gặp sự cố tương tự. Người đàn ông mà hút bóng !!! –

+0

Bạn là một vị thần. Tôi đã đánh đầu của tôi chống lại vấn đề này trong sáu giờ liên tục, bây giờ. Đã thử mọi thứ tôi có thể nghĩ đến và mọi thứ tôi có thể nghĩ đến Google. Không may mắn. Cuối cùng tìm thấy bài viết của bạn và, tất nhiên, tôi đã vội vàng và làm cho họ lĩnh vực, không phải tài sản. – Locke

Trả lời

14

Thuộc tính trên lưới bạn có ràng buộc với Opcode không? .. nếu bạn muốn liên kết trực tiếp với Danh sách, bạn chỉ cần DataSource = list. Các databindings cho phép tùy chỉnh ràng buộc. bạn đang cố làm gì khác ngoài nguồn dữ liệu?

Bạn đang nhận được một loạt các hàng trống? cột được tạo tự động có tên không? Bạn đã xác minh dữ liệu nằm trong đối tượng (không chỉ là string.empty)?

class MyObject 
    { 
     public string Something { get; set; } 
     public string Text { get; set; } 
     public string Other { get; set; } 
    } 

    public Form1() 
    { 
     InitializeComponent(); 

     List<MyObject> myList = new List<MyObject>(); 

     for (int i = 0; i < 200; i++) 
     { 
      string num = i.ToString(); 
      myList.Add(new MyObject { Something = "Something " + num , Text = "Some Row " + num , Other = "Other " + num }); 
     } 

     dataGridView1.DataSource = myList; 
    } 

này sẽ làm việc tốt ...

+0

Có. Nếu tôi chỉ làm DataSource = danh sách, tôi nhận được một loạt các cột trống. – FlySwat

+1

Vì vậy, bạn chỉ muốn liên kết lưới với thuộc tính opcode trong danh sách các đối tượng tùy chỉnh? –

+0

Nếu những gì tôi hỏi là diễn viên sau đó làm ... Grid.DataSource = MyList.Select (o => o.Opcode); –

5

tôi có thể không thực sự biết những gì bạn đang cố gắng để làm với ví dụ bạn đã bao gồm, nhưng ràng buộc vào một danh sách chung của các đối tượng là khá đơn giản nếu bạn chỉ muốn liệt kê các đối tượng:

private BindingSource _gridSource; 

    private BindingSource GridSource 
    { 
     get 
     { 
      if (_gridSource == null) 
       _gridSource = new BindingSource(); 
      return _gridSource; 
     } 
    } 

    private void Form1_Load(object sender, EventArgs e) 
    { 
     List<FluffyBunny> list = new List<FluffyBunny>(); 
     list.Add(new FluffyBunny { Color = "White", EarType = "Long", Name = "Stan" }); 
     list.Add(new FluffyBunny { Color = "Brown", EarType = "Medium", Name = "Mike" }); 
     list.Add(new FluffyBunny { Color = "Mottled", EarType = "Short", Name = "Torvald" }); 

     GridSource.DataSource = list; 
     dataGridView1.Columns["EarType"].Visible = false; //Optionally hide a column 
     dataGridView1.DataSource = GridSource; 

    } 

Nếu bạn chỉ muốn hiển thị các thuộc tính cụ thể của loại danh sách, bạn có thể vô hiệu hóa các cột không mong muốn.

Về mặt kỹ thuật, bạn không thực sự cần tạo BindingSource, nhưng tôi thấy nó dễ dàng hơn rất nhiều khi tôi cập nhật hoặc thay đổi nếu có.

Hy vọng điều này sẽ hữu ích.

+0

Khi ràng buộc trực tiếp vào Danh sách , tôi nhận được một loạt các hàng trống, không có dữ liệu. Lớp học trong Danh sách chỉ chứa 3 chuỗi. – FlySwat

+0

Cảm ơn Jared! Nhận xét của bạn về BindingSource thực sự đã giúp tôi khi tôi cố gắng tìm ra cách tạo hàng mới khi sử dụng Danh sách . Có một cú nhấp chuột! –

+0

+1 cho dữ liệu thú vị – SteveCav

4

Có cùng vấn đề ... Tôi đã có cấu trúc rõ ràng với các trường công khai. không có gì trong lưới. cung cấp getters công cộng, làm việc.

+0

Làm việc cho tôi! Tks – Pascal

3

Một giải pháp khác mà tôi đã tìm thấy là sử dụng bộ sưu tập BindingList.



private void Form1_Load(object sender, EventArgs e) 
{ 
    BindingList people= new BindingList { 
    new Person {Name="John",Age=23}, 
    new Person {Name="Lucy",Age=16} 
    }; 

    dataGridView1.DataSource= people; 
} 

Nó hoạt động tốt đối với tôi,

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