2011-08-05 58 views
20

Tôi có một ứng dụng nhỏ trong C#, nó có một DataGridView đó được lấp đầy bằng:Làm cách nào để ẩn cột DataGridView khi sử dụng DataSource tùy chỉnh?

grid.DataSource = MyDatasource array;

MyClass giữ cấu trúc cho các cột, nó trông giống như sau:

class MyDatasource 
{ 
    private string column1;   
    private string column2; 

    public MyDatasource(string arg1, string arg2) 
    { 
     this.column1 = arg1; 
     this.column2 = arg2; 
    } 

    public string column1 
    { 
     get 
     { 
      return this.column1; 
     } 
     set 
     { 
      this.column1 = value; 
     } 
    } 

    public string column2 
    { 
     get 
     { 
      return this.column2; 
     } 
     set 
     { 
      this.column1 = value; 
     } 
    } 
} 

Tất cả mọi thứ hoạt động tốt và DataGridView được phổ biến với dữ liệu chính xác, nhưng bây giờ tôi muốn ẩn cột2. Tôi đã thử thêm [Browsable(false)] phía trên khai báo cột, điều này sẽ ẩn nó, nhưng tôi cũng cần truy cập giá trị cột từ mã và khi tôi sử dụng [Browsable(false)] và cố đọc nội dung hoạt động như cột không tồn tại. Nếu tôi không sử dụng nó tôi có thể đọc cột mà không có vấn đề nhưng nó có thể nhìn thấy trong DataGridView.

Làm cách nào để ẩn cột nhưng vẫn có thể đọc nội dung của nó từ mã?

Trả lời

2

Set rằng tài sản Visible đặc biệt cột của = false

dataGridView[ColumnName or Index].Visible = false;

Sửa xin lỗi bỏ lỡ Columns tài sản dataGridView.Columns[ColumnName or Index].Visible = false;

31

Bạn phải ẩn cột tại sự kiểm soát xem lưới chứ không phải tại nguồn dữ liệu. Ẩn nó ở nguồn dữ liệu, nó sẽ không hiển thị ở chế độ xem lưới, do đó bạn sẽ không thể truy cập giá trị trong chế độ xem lưới. Làm theo cách bạn đang đề xuất, bạn sẽ phải truy cập giá trị cột thông qua nguồn dữ liệu trái ngược với chế độ xem lưới.

Để ẩn cột trên sự kiểm soát xem lưới, bạn có thể sử dụng mã như thế này:

dataGridView1.Columns[0].Visible = false; 

Để truy cập vào cột từ nguồn dữ liệu, bạn có thể thử một cái gì đó như thế này:

object colValue = ((DataTable)dataGridView.DataSource).Rows[dataSetIndex]["ColumnName"]; 
+0

'Có thể nhìn thấy' là "ReadOnly" sau khi kiểm soát được tạo ra. –

6

Tôi "m không chắc chắn nếu nó quá muộn, nhưng vấn đề là, bạn không thể thiết lập các cột trong chế độ thiết kế nếu bạn đang ràng buộc tại thời gian chạy. Vì vậy, nếu bạn đang ràng buộc tại thời gian chạy, đi trước và loại bỏ các cột từ chế độ thiết kế và thực hiện nó theo cách thực tế

cũ ..

 if (dt.Rows.Count > 0) 
    { 
     dataGridViewProjects.DataSource = dt; 
     dataGridViewProjects.Columns["Title"].Width = 300; 
     dataGridViewProjects.Columns["ID"].Visible = false; 
    } 
35

Trong một số trường hợp, nó có thể là một ý tưởng tồi để trước hết phải thêm cột vào DataGridView và sau đó ẩn nó.

Ví dụ: tôi có một lớp có proxy NHibernate cho thuộc tính Hình ảnh cho biểu trưng của công ty. Nếu tôi truy cập thuộc tính đó (ví dụ: bằng cách gọi phương thức ToString của nó để hiển thị trong một DataGridView), nó sẽ tải xuống hình ảnh từ máy chủ SQL. Nếu tôi đã có một danh sách các công ty đối tượng và sử dụng đó như dataSource của DataGridView như thế, sau đó (tôi nghi ngờ) nó sẽ tải về TẤT CẢ các biểu tượng TRƯỚC KHI tôi có thể ẩn cột.

Để ngăn chặn điều này, tôi đã sử dụng thuộc tính tùy chỉnh

[System.ComponentModel.Browsable(false)] 

về quyền sở hữu hình ảnh, do đó DataGridView bỏ qua bất động sản (không tạo ra các cột và không gọi các phương pháp ToString).

public class Company 
{ 
    ... 
    [System.ComponentModel.Browsable(false)] 
    virtual public MyImageClass Logo { get; set;} 
+0

Đây chắc chắn là cách tốt nhất để làm điều đó nếu bạn làm việc với một tài sản mà bạn biết bạn sẽ không bao giờ muốn hiển thị. – Henry

+1

Đây là câu trả lời hay nhất. Giai đoạn. – Buddha

+0

Đồng bộ hóa giải pháp thanh lịch nhất +1 – ChenChi

0

tôi đã cùng một vấn đề

Đây là giải pháp mà có thể làm việc cho bạn. Nó làm việc cho tôi

GridView1.DataBind(); 
if (GridView1.Columns.Count > 0) 
    GridView1.Columns[0].Visible = false; 
else 
{ 
    GridView1.HeaderRow.Cells[0].Visible = false; 
    foreach (GridViewRow gvr in GridView1.Rows) 
    { 
     gvr.Cells[0].Visible = false; 
    } 
} 
4

tôi đã nhận thấy rằng nếu sử dụng progrmmatically nó ám đầy đủ (toàn bộ hình thức đơn giản là không "sơn" bất cứ điều gì) nếu được sử dụng trước khi panel1.Controls.Add(dataGridView); sau đó dataGridView.Columns["ID"].Visible = false; sẽ phá vỡ toàn bộ hình thức và làm cho nó trống, vì vậy để có được vòng mà thiết lập này SAU EG:

panel1.Controls.Add(dataGridView); 
dataGridView.Columns["ID"].Visible = false; 
//works 

dataGridView.Columns["ID"].Visible = false; 
panel1.Controls.Add(dataGridView); 
//fails miserably 
Các vấn đề liên quan