2010-03-12 44 views
8

Tôi thậm chí không chắc chắn nếu tôi đang làm điều này một cách chính xác. Nhưng về cơ bản tôi có một danh sách các đối tượng được xây dựng từ một lớp. Từ đó, tôi ràng buộc danh sách với chế độ xem dữ liệu trên Biểu mẫu Windows (C#)Danh sách các đối tượng Databind cho một DataGridView WinForms, nhưng không hiển thị một số thuộc tính công cộng

Từ đó, nó hiển thị tất cả thuộc tính công khai của đối tượng, trong chế độ xem dữ liệu. Tuy nhiên có một số thuộc tính mà tôi vẫn cần truy cập từ các phần khác của ứng dụng của tôi, nhưng không thực sự cần thiết để có thể nhìn thấy trong DataGridView.

Vì vậy, có một thuộc tính hoặc một cái gì đó tương tự mà tôi có thể viết phía trên thuộc tính để loại trừ nó khỏi được hiển thị.

P.S. Im ràng buộc khi chạy. Vì vậy, tôi không thể chỉnh sửa các cột thông qua nhà thiết kế.

P.P.S. Xin vui lòng không có câu trả lời chỉ làm cho các biến công cộng (Mặc dù nếu đó là cách duy nhất, cho tôi biết :)).

+3

Bạn có thể tắt 'DataGridView.AutoGenerateColumns' (http://goo.gl/41qt) và thêm các cột bắt buộc theo cách động. Tôi không thực sự hiểu khi bạn nói "... Tôi đang ràng buộc trong thời gian chạy. Vì vậy, tôi không thể chỉnh sửa các cột thông qua các nhà thiết kế." – Vivek

+0

Điều tôi đang nói là. Tôi không sử dụng nhà thiết kế và ràng buộc với nguồn dữ liệu. Im chỉ cần viết: datagridview.datasource = mylist; – MindingData

+0

Có thể bạn có thể cho chúng tôi biết lý do tại sao bạn có ràng buộc trong thời gian chạy thay vì thông qua nhà thiết kế. Điều đó có thể giúp –

Trả lời

14

Thêm [Browsable(false)] thuộc tính đến tài sản công cộng mà bạn không muốn tạo ra cột.

+1

+1 Nếu chỉ cần thêm tác phẩm này, điều này sẽ tốt hơn nhiều so với câu trả lời của tôi! :-) – Javier

+0

đẹp Tôi đã thử nó, nó hoạt động =) Tôi đã cố gắng để làm điều này thêm các lớp học tùy chỉnh của tôi. Cảm ơn! – Javier

2

Tôi đã trả lời giống như @Vivek nói trong nhận xét của mình. Tôi không biết tại sao anh ta không thêm câu trả lời ở đây ...

Vâng, nếu bạn để một điều khiển DataGridView tự động tạo cột, nó sẽ hiển thị tất cả các thuộc tính trong các đối tượng được liên kết. Vì vậy, trước hết, bạn phải bật DataGridView.AutoGenerateColumns = false.

Sau đó, bạn có thể thêm cột khi chạy. Ví dụ:

DataGridViewColumn myColumn = new DataGridViewTextBoxColumn(); 
myColumn.DataPropertyName.HeaderText = "Title of the column"; 
myColumn.DataPropertyName = "NameOfTheProperty"; 

//... 

MyDataGridView.Columns.Add(myColumn); 
+0

Thêm mọi thứ theo cách thủ công có lẽ là phương sách cuối cùng của tôi ở đây. – MindingData

+0

Sau đó, tôi có một ý tưởng, nhưng nó quá lớn, tôi sẽ đặt nó vào một câu trả lời khác. – Javier

+1

Hãy quên đi ý tưởng thứ hai này. Xem câu trả lời @Vivek thay vì = P – Javier

0

Ngoài câu trả lời trước của tôi, kể từ khi bạn thích để chỉ ra không thêm các cột bằng tay, tôi đề nghị bạn một lựa chọn khác: thuộc tính sử dụng tùy chỉnh trong tài sản của bạn định nghĩa.

Trước tiên, bạn phải mã thuộc tính tùy chỉnh của bạn:

lớp MyPropertyAttribute

Bạn có thể sử dụng nó trong các lớp học của bạn, chỉ cần như thế này:

Foo lớp

public class Foo 
{ 
    private string name; 
    private string surname; 

    [MyPropertyAttribute(MyPropertyAttribute.VisibilityOptions.visible)] 
    public string Name 
    { 
     get 
     { 
      return name; 
     } 
     set 
     { 
      name = value; 
     } 
    } 

    [MyPropertyAttribute(MyPropertyAttribute.VisibilityOptions.invisible)] 
    public string Surname 
    { 
     get 
     { 
      return surname; 
     } 
     set 
     { 
      surname = value; 
     } 
    } 

} 

Bạn có thể viết một phương thức, lặp lại các thuộc tính trong các đối tượng liên kết của bạn, sử dụng sự phản chiếu và kiểm tra xem chúng có được đánh dấu là có thể nhìn thấy hoặc không nhìn thấy được, để thêm hoặc không thêm cột. Bạn thậm chí có thể có một DataGridView tùy chỉnh với hành vi này, vì vậy bạn không phải lặp lại điều này mọi lúc. Bạn sẽ chỉ sử dụng DataGridView tùy chỉnh của mình và đánh dấu khả năng hiển thị trong các thuộc tính.

Something như thế này ...

public class MyCustomDataGridView : DataGridView 
    { 

     public MyCustomDataGridView() 
     { 
      this.AutoGenerateColumns = false; 
     } 

     public void Load<T>(ICollection<T> collection) 
     { 

      foreach(object myAttribute in typeof(T).GetCustomAttributes(typeof(MyPropertyAttribute).GetType(), true)) 
      { 
       if (((MyPropertyAttribute)myAttribute).Visibility == MyPropertyAttribute.VisibilityOptions.visible) 
       { 
        //... 
       } 
      } 

     } 

    } 
0

Tôi biết một chút về bài đăng cũ, nhưng chỉ để rõ ràng, tôi muốn thêm rằng điều này cũng có thể đạt được bằng cách xác định định nghĩa loại tùy chỉnh bằng giao diện ICustomTypeDescriptor. Nó trông giống như một công việc nhiều hơn một chút nhưng bạn chỉ có thể thực hiện những gì bạn cần (trong trường hợp này là GetProperties). Nó làm cho mọi việc dễ dàng hơn sau này bởi vì hầu hết các cột được liệt kê trong danh sách các ô lưới/danh sách tự động hỗ trợ phương pháp này.

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